mirror of https://github.com/jumpserver/jumpserver
[Bugfix] 修复时间日期搜索的bug,select2模块自适应长度
parent
3d705dbeaa
commit
0848893f1e
|
@ -90,7 +90,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
authFieldsDisplay();
|
authFieldsDisplay();
|
||||||
$(auto_generate_key).change(function () {
|
$(auto_generate_key).change(function () {
|
||||||
authFieldsDisplay();
|
authFieldsDisplay();
|
||||||
|
|
|
@ -56,7 +56,7 @@
|
||||||
{% block custom_foot_js %}
|
{% block custom_foot_js %}
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
|
@ -157,7 +157,7 @@ function bindToCluster(clusters) {
|
||||||
|
|
||||||
jumpserver.cluster_selected = {};
|
jumpserver.cluster_selected = {};
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2().on('select2:select', function(evt) {
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });.on('select2:select', function(evt) {
|
||||||
var data = evt.params.data;
|
var data = evt.params.data;
|
||||||
jumpserver.cluster_selected[data.id] = data.text;
|
jumpserver.cluster_selected[data.id] = data.text;
|
||||||
}).on('select2:unselect', function(evt) {
|
}).on('select2:unselect', function(evt) {
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
{% block custom_foot_js %}
|
{% block custom_foot_js %}
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
}).on('click', '.field-tag', function() {
|
}).on('click', '.field-tag', function() {
|
||||||
changeField(this);
|
changeField(this);
|
||||||
}).on('click', '#change_all', function () {
|
}).on('click', '#change_all', function () {
|
||||||
|
|
|
@ -47,7 +47,7 @@
|
||||||
{% block custom_foot_js %}
|
{% block custom_foot_js %}
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
{# $("#id_tags").select2({#}
|
{# $("#id_tags").select2({#}
|
||||||
{# tags: true,#}
|
{# tags: true,#}
|
||||||
{# maximumSelectionLength: 8 //最多能够选择的个数#}
|
{# maximumSelectionLength: 8 //最多能够选择的个数#}
|
||||||
|
|
|
@ -81,7 +81,7 @@
|
||||||
{% block custom_foot_js %}
|
{% block custom_foot_js %}
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
$('.select2-system-user').select2();
|
$('.select2-system-user').select2();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -184,7 +184,7 @@ function initTable() {
|
||||||
}
|
}
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
|
|
||||||
$('.select2.asset-select').select2()
|
$('.select2.asset-select').select2()
|
||||||
.on('select2:select', function(evt) {
|
.on('select2:select', function(evt) {
|
||||||
|
|
|
@ -181,7 +181,7 @@ function initTable() {
|
||||||
}
|
}
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2()
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
.on("select2:select", function (evt) {
|
.on("select2:select", function (evt) {
|
||||||
var data = evt.params.data;
|
var data = evt.params.data;
|
||||||
jumpserver.assets_selected[data.id] = data.text;
|
jumpserver.assets_selected[data.id] = data.text;
|
||||||
|
|
|
@ -69,7 +69,10 @@
|
||||||
{% block custom_foot_js %}
|
{% block custom_foot_js %}
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2({
|
||||||
|
dropdownAutoWidth : true,
|
||||||
|
width: 'auto'
|
||||||
|
});
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
|
@ -151,7 +151,7 @@
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
})
|
})
|
||||||
.on('click', '.btn-delete-cluster', function () {
|
.on('click', '.btn-delete-cluster', function () {
|
||||||
var name = "{{ cluster.name }}";
|
var name = "{{ cluster.name }}";
|
||||||
|
|
|
@ -125,7 +125,7 @@ function initAssetsTable() {
|
||||||
}
|
}
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2()
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
.on("select2:select", function (evt) {
|
.on("select2:select", function (evt) {
|
||||||
var data = evt.params.data;
|
var data = evt.params.data;
|
||||||
jumpserver.assets_selected[data.id] = data.text;
|
jumpserver.assets_selected[data.id] = data.text;
|
||||||
|
|
|
@ -212,7 +212,7 @@ function updateSystemUserCluster(clusters) {
|
||||||
}
|
}
|
||||||
jumpserver.cluster_selected = {};
|
jumpserver.cluster_selected = {};
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2()
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
.on('select2:select', function(evt) {
|
.on('select2:select', function(evt) {
|
||||||
var data = evt.params.data;
|
var data = evt.params.data;
|
||||||
jumpserver.cluster_selected[data.id] = data.text;
|
jumpserver.cluster_selected[data.id] = data.text;
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
{% block custom_foot_js %}
|
{% block custom_foot_js %}
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
|
@ -3,14 +3,14 @@
|
||||||
import inspect
|
import inspect
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.http import JsonResponse
|
from django.http import JsonResponse
|
||||||
from django.utils.timezone import now
|
from django.utils import timezone
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class NoDeleteQuerySet(models.query.QuerySet):
|
class NoDeleteQuerySet(models.query.QuerySet):
|
||||||
|
|
||||||
def delete(self):
|
def delete(self):
|
||||||
return self.update(is_discard=True, discard_time=now())
|
return self.update(is_discard=True, discard_time=timezone.now())
|
||||||
|
|
||||||
|
|
||||||
class NoDeleteManager(models.Manager):
|
class NoDeleteManager(models.Manager):
|
||||||
|
@ -36,7 +36,7 @@ class NoDeleteModelMixin(models.Model):
|
||||||
|
|
||||||
def delete(self):
|
def delete(self):
|
||||||
self.is_discard = True
|
self.is_discard = True
|
||||||
self.discard_time = now()
|
self.discard_time = timezone.now()
|
||||||
return self.save()
|
return self.save()
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,3 +87,29 @@ class BulkSerializerMixin(object):
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
class DatetimeSearchMixin:
|
||||||
|
date_from = date_to = None
|
||||||
|
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
date_from_s = self.request.GET.get('date_from')
|
||||||
|
date_to_s = self.request.GET.get('date_to')
|
||||||
|
|
||||||
|
if date_from_s:
|
||||||
|
date_from = timezone.datetime.strptime(date_from_s, '%m/%d/%Y')
|
||||||
|
self.date_from = date_from.replace(
|
||||||
|
tzinfo=timezone.get_current_timezone()
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
self.date_from = timezone.now() - timezone.timedelta(7)
|
||||||
|
|
||||||
|
if date_to_s:
|
||||||
|
date_to = timezone.datetime.strptime(
|
||||||
|
date_to_s + ' 23:59:59', '%m/%d/%Y %H:%M:%S'
|
||||||
|
)
|
||||||
|
self.date_to = date_to.replace(
|
||||||
|
tzinfo=timezone.get_current_timezone()
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
self.date_to = timezone.now()
|
||||||
|
return super().get(request, *args, **kwargs)
|
|
@ -16,9 +16,9 @@
|
||||||
<div class="form-group" id="date">
|
<div class="form-group" id="date">
|
||||||
<div class="input-daterange input-group" id="datepicker">
|
<div class="input-daterange input-group" id="datepicker">
|
||||||
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
|
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
|
||||||
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_from" value="{{ date_from }}">
|
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_from" value="{{ date_from|date:"m/d/Y" }}">
|
||||||
<span class="input-group-addon">to</span>
|
<span class="input-group-addon">to</span>
|
||||||
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_to" value="{{ date_to }}">
|
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_to" value="{{ date_to|date:"m/d/Y" }}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
|
@ -89,7 +89,10 @@ $(document).ready(function() {
|
||||||
"bInfo" : false,
|
"bInfo" : false,
|
||||||
"order": []
|
"order": []
|
||||||
});
|
});
|
||||||
$('.select2').select2();
|
$('.select2').select2({
|
||||||
|
dropdownAutoWidth : true,
|
||||||
|
width: 'auto'
|
||||||
|
});
|
||||||
$('#date .input-daterange').datepicker({
|
$('#date .input-daterange').datepicker({
|
||||||
dateFormat: 'mm/dd/yy',
|
dateFormat: 'mm/dd/yy',
|
||||||
keyboardNavigation: false,
|
keyboardNavigation: false,
|
||||||
|
|
|
@ -9,40 +9,27 @@ from django.views.generic import ListView, DetailView, View
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.shortcuts import redirect, reverse
|
from django.shortcuts import redirect, reverse
|
||||||
|
|
||||||
|
from common.mixins import DatetimeSearchMixin
|
||||||
from .models import Task, AdHoc, AdHocRunHistory
|
from .models import Task, AdHoc, AdHocRunHistory
|
||||||
from ops.tasks import rerun_task
|
from ops.tasks import rerun_task
|
||||||
|
|
||||||
|
|
||||||
class TaskListView(ListView):
|
class TaskListView(DatetimeSearchMixin, ListView):
|
||||||
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
|
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
|
||||||
model = Task
|
model = Task
|
||||||
ordering = ('-date_created',)
|
ordering = ('-date_created',)
|
||||||
context_object_name = 'task_list'
|
context_object_name = 'task_list'
|
||||||
template_name = 'ops/task_list.html'
|
template_name = 'ops/task_list.html'
|
||||||
date_format = '%m/%d/%Y'
|
date_format = '%m/%d/%Y'
|
||||||
keyword = date_from_s = date_to_s = ''
|
keyword = ''
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
date_to_default = timezone.now()
|
|
||||||
date_from_default = timezone.now() - timezone.timedelta(7)
|
|
||||||
date_from_default_s = date_from_default.strftime(self.date_format)
|
|
||||||
date_to_default_s = date_to_default.strftime(self.date_format)
|
|
||||||
|
|
||||||
self.queryset = super().get_queryset()
|
self.queryset = super().get_queryset()
|
||||||
self.keyword = self.request.GET.get('keyword', '')
|
self.keyword = self.request.GET.get('keyword', '')
|
||||||
self.date_from_s = self.request.GET.get('date_from', date_from_default_s)
|
self.queryset = self.queryset.filter(
|
||||||
self.date_to_s = self.request.GET.get('date_to', date_to_default_s)
|
date_created__gt=self.date_from,
|
||||||
|
date_created__lt=self.date_to
|
||||||
if self.date_from_s:
|
)
|
||||||
date_from = datetime.strptime(self.date_from_s, self.date_format)
|
|
||||||
date_from = date_from.replace(tzinfo=timezone.get_current_timezone())
|
|
||||||
self.queryset = self.queryset.filter(date_created__gt=date_from)
|
|
||||||
|
|
||||||
if self.date_to_s:
|
|
||||||
date_to = timezone.datetime.strptime(
|
|
||||||
self.date_to_s + ' 23:59:59', '%m/%d/%Y %H:%M:%S')
|
|
||||||
date_to = date_to.replace(tzinfo=timezone.get_current_timezone())
|
|
||||||
self.queryset = self.queryset.filter(date_created__lt=date_to)
|
|
||||||
|
|
||||||
if self.keyword:
|
if self.keyword:
|
||||||
self.queryset = self.queryset.filter(
|
self.queryset = self.queryset.filter(
|
||||||
|
@ -51,15 +38,16 @@ class TaskListView(ListView):
|
||||||
return self.queryset
|
return self.queryset
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
|
print(self.date_from)
|
||||||
context = {
|
context = {
|
||||||
'app': 'Ops',
|
'app': 'Ops',
|
||||||
'action': _('Task list'),
|
'action': _('Task list'),
|
||||||
'date_from': self.date_from_s,
|
'date_from': self.date_from,
|
||||||
'date_to': self.date_to_s,
|
'date_to': self.date_to,
|
||||||
'keyword': self.keyword,
|
'keyword': self.keyword,
|
||||||
}
|
}
|
||||||
kwargs.update(context)
|
kwargs.update(context)
|
||||||
return super(TaskListView, self).get_context_data(**kwargs)
|
return super().get_context_data(**kwargs)
|
||||||
|
|
||||||
|
|
||||||
class TaskDetailView(DetailView):
|
class TaskDetailView(DetailView):
|
||||||
|
|
|
@ -79,7 +79,7 @@
|
||||||
<script src="{% static 'js/plugins/datepicker/bootstrap-datepicker.js' %}"></script>
|
<script src="{% static 'js/plugins/datepicker/bootstrap-datepicker.js' %}"></script>
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
|
|
||||||
$('.input-group.date').datepicker({
|
$('.input-group.date').datepicker({
|
||||||
format: "yyyy-mm-dd",
|
format: "yyyy-mm-dd",
|
||||||
|
|
|
@ -190,7 +190,7 @@ function updateSystemUser(system_users) {
|
||||||
}
|
}
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2()
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
.on('select2:select', function(evt) {
|
.on('select2:select', function(evt) {
|
||||||
var data = evt.params.data;
|
var data = evt.params.data;
|
||||||
jumpserver.system_users_selected[data.id] = data.text;
|
jumpserver.system_users_selected[data.id] = data.text;
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
{% block custom_head_css_js %}
|
{% block custom_head_css_js %}
|
||||||
<link href="{% static "css/plugins/footable/footable.core.css" %}" rel="stylesheet">
|
<link href="{% static "css/plugins/footable/footable.core.css" %}" rel="stylesheet">
|
||||||
<link href="{% static 'css/plugins/datepicker/datepicker3.css' %}" rel="stylesheet">
|
<link href="{% static 'css/plugins/datepicker/datepicker3.css' %}" rel="stylesheet">
|
||||||
|
<link href="{% static 'css/plugins/select2/select2.min.css' %}" rel="stylesheet">
|
||||||
|
<script src="{% static 'js/plugins/select2/select2.full.min.js' %}"></script>
|
||||||
<style>
|
<style>
|
||||||
#search_btn {
|
#search_btn {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
|
@ -20,9 +22,9 @@
|
||||||
<div class="form-group" id="date">
|
<div class="form-group" id="date">
|
||||||
<div class="input-daterange input-group" id="datepicker">
|
<div class="input-daterange input-group" id="datepicker">
|
||||||
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
|
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
|
||||||
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_from" value="{{ date_from }}">
|
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_from" value="{{ date_from|date:"m/d/Y" }}">
|
||||||
<span class="input-group-addon">to</span>
|
<span class="input-group-addon">to</span>
|
||||||
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_to" value="{{ date_to }}">
|
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_to" value="{{ date_to|date:"m/d/Y" }}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
|
@ -93,20 +95,23 @@
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block custom_foot_js %}
|
{% block custom_foot_js %}
|
||||||
<script src="{% static "js/plugins/footable/footable.all.min.js" %}"></script>
|
<script src="{% static "js/plugins/footable/footable.all.min.js" %}"></script>
|
||||||
<script src="{% static 'js/plugins/datepicker/bootstrap-datepicker.js' %}"></script>
|
<script src="{% static 'js/plugins/datepicker/bootstrap-datepicker.js' %}"></script>
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.footable').footable();
|
$('.footable').footable();
|
||||||
$('.select2').select2();
|
$('.select2').select2({
|
||||||
$('#date .input-daterange').datepicker({
|
dropdownAutoWidth : true,
|
||||||
dateFormat: 'mm/dd/yy',
|
width: 'auto'
|
||||||
keyboardNavigation: false,
|
|
||||||
forceParse: false,
|
|
||||||
autoclose: true
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
</script>
|
$('#date .input-daterange').datepicker({
|
||||||
|
dateFormat: 'mm/dd/yy',
|
||||||
|
keyboardNavigation: false,
|
||||||
|
forceParse: false,
|
||||||
|
autoclose: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
{% load terminal_tags %}
|
{% load terminal_tags %}
|
||||||
{% block custom_head_css_js %}
|
{% block custom_head_css_js %}
|
||||||
<link href="{% static 'css/plugins/datepicker/datepicker3.css' %}" rel="stylesheet">
|
<link href="{% static 'css/plugins/datepicker/datepicker3.css' %}" rel="stylesheet">
|
||||||
|
<link href="{% static "css/plugins/select2/select2.min.css" %}" rel="stylesheet">
|
||||||
|
<script src="{% static "js/plugins/select2/select2.full.min.js" %}"></script>
|
||||||
<style>
|
<style>
|
||||||
#search_btn {
|
#search_btn {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
|
@ -20,9 +22,9 @@
|
||||||
<div class="form-group" id="date">
|
<div class="form-group" id="date">
|
||||||
<div class="input-daterange input-group" id="datepicker">
|
<div class="input-daterange input-group" id="datepicker">
|
||||||
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
|
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
|
||||||
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_from" value="{{ date_from }}">
|
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_from" value="{{ date_from|date:"m/d/Y" }}">
|
||||||
<span class="input-group-addon">to</span>
|
<span class="input-group-addon">to</span>
|
||||||
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_to" value="{{ date_to }}">
|
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_to" value="{{ date_to|date:"m/d/Y" }}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
|
@ -129,7 +131,8 @@
|
||||||
"order": []
|
"order": []
|
||||||
});
|
});
|
||||||
$('.select2').select2({
|
$('.select2').select2({
|
||||||
dropdownAutoWidth: true
|
dropdownAutoWidth: true,
|
||||||
|
width: "auto"
|
||||||
});
|
});
|
||||||
$('#date .input-daterange').datepicker({
|
$('#date .input-daterange').datepicker({
|
||||||
dateFormat: 'mm/dd/yy',
|
dateFormat: 'mm/dd/yy',
|
||||||
|
|
|
@ -57,7 +57,7 @@
|
||||||
<script src="{% static 'js/plugins/datepicker/bootstrap-datepicker.js' %}"></script>
|
<script src="{% static 'js/plugins/datepicker/bootstrap-datepicker.js' %}"></script>
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
|
|
||||||
$('.input-group.date').datepicker({
|
$('.input-group.date').datepicker({
|
||||||
format: "yyyy-mm-dd",
|
format: "yyyy-mm-dd",
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#
|
#
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
from django.views.generic import ListView
|
from django.views.generic import ListView
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
|
||||||
|
from common.mixins import DatetimeSearchMixin
|
||||||
from ..models import Command
|
from ..models import Command
|
||||||
from .. import utils
|
from .. import utils
|
||||||
from ..backends import get_command_store
|
from ..backends import get_command_store
|
||||||
|
@ -15,39 +15,19 @@ __all__ = ['CommandListView']
|
||||||
command_store = get_command_store()
|
command_store = get_command_store()
|
||||||
|
|
||||||
|
|
||||||
class CommandListView(ListView):
|
class CommandListView(DatetimeSearchMixin, ListView):
|
||||||
model = Command
|
model = Command
|
||||||
template_name = "terminal/command_list.html"
|
template_name = "terminal/command_list.html"
|
||||||
context_object_name = 'command_list'
|
context_object_name = 'command_list'
|
||||||
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
|
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
|
||||||
command = user = asset = system_user = date_from_s = date_to_s = ''
|
command = user = asset = system_user = ""
|
||||||
|
date_from = date_to = None
|
||||||
date_format = '%m/%d/%Y'
|
date_format = '%m/%d/%Y'
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
date_to_default = timezone.now()
|
filter_kwargs = dict()
|
||||||
date_from_default = timezone.now() - timezone.timedelta(7)
|
filter_kwargs['date_from'] = self.date_from
|
||||||
date_to_default_s = date_to_default.strftime(self.date_format)
|
filter_kwargs['date_to'] = self.date_to
|
||||||
date_from_default_s = date_from_default.strftime(self.date_format)
|
|
||||||
|
|
||||||
self.command = self.request.GET.get('command', '')
|
|
||||||
self.user = self.request.GET.get('user')
|
|
||||||
self.asset = self.request.GET.get('asset')
|
|
||||||
self.system_user = self.request.GET.get('system_user')
|
|
||||||
self.date_from_s = self.request.GET.get('date_from', date_from_default_s)
|
|
||||||
self.date_to_s = self.request.GET.get('date_to', date_to_default_s)
|
|
||||||
|
|
||||||
filter_kwargs = {}
|
|
||||||
if self.date_from_s:
|
|
||||||
date_from = datetime.strptime(self.date_from_s, self.date_format)
|
|
||||||
date_from = date_from.replace(
|
|
||||||
tzinfo=timezone.get_current_timezone()
|
|
||||||
)
|
|
||||||
filter_kwargs['date_from'] = date_from
|
|
||||||
if self.date_to_s:
|
|
||||||
date_to = timezone.datetime.strptime(
|
|
||||||
self.date_to_s + ' 23:59:59', '%m/%d/%Y %H:%M:%S')
|
|
||||||
date_to = date_to.replace(tzinfo=timezone.get_current_timezone())
|
|
||||||
filter_kwargs['date_to'] = date_to
|
|
||||||
if self.user:
|
if self.user:
|
||||||
filter_kwargs['user'] = self.user
|
filter_kwargs['user'] = self.user
|
||||||
if self.asset:
|
if self.asset:
|
||||||
|
@ -68,8 +48,8 @@ class CommandListView(ListView):
|
||||||
'asset_list': utils.get_asset_list_from_cache(),
|
'asset_list': utils.get_asset_list_from_cache(),
|
||||||
'system_user_list': utils.get_system_user_list_from_cache(),
|
'system_user_list': utils.get_system_user_list_from_cache(),
|
||||||
'command': self.command,
|
'command': self.command,
|
||||||
'date_from': self.date_from_s,
|
'date_from': self.date_from,
|
||||||
'date_to': self.date_to_s,
|
'date_to': self.date_to,
|
||||||
'username': self.user,
|
'username': self.user,
|
||||||
'asset': self.asset,
|
'asset': self.asset,
|
||||||
'system_user': self.system_user,
|
'system_user': self.system_user,
|
||||||
|
|
|
@ -1,20 +1,14 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#
|
#
|
||||||
|
|
||||||
import time
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
from django.views.generic import ListView, UpdateView, DeleteView, DetailView, TemplateView
|
from django.views.generic import ListView, UpdateView, DeleteView, DetailView, TemplateView
|
||||||
from django.views.generic.edit import SingleObjectMixin
|
from django.views.generic.edit import SingleObjectMixin
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.module_loading import import_string
|
|
||||||
from django.urls import reverse_lazy
|
|
||||||
from django.http import HttpResponse
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db.models import Q
|
|
||||||
|
|
||||||
from users.utils import AdminUserRequiredMixin
|
from users.utils import AdminUserRequiredMixin
|
||||||
|
from common.mixins import DatetimeSearchMixin
|
||||||
from ..models import Session, Command, Terminal
|
from ..models import Session, Command, Terminal
|
||||||
from ..backends import get_command_store
|
from ..backends import get_command_store
|
||||||
from .. import utils
|
from .. import utils
|
||||||
|
@ -28,37 +22,24 @@ __all__ = [
|
||||||
command_store = get_command_store()
|
command_store = get_command_store()
|
||||||
|
|
||||||
|
|
||||||
class SessionListView(AdminUserRequiredMixin, ListView):
|
class SessionListView(AdminUserRequiredMixin, DatetimeSearchMixin, ListView):
|
||||||
model = Session
|
model = Session
|
||||||
template_name = 'terminal/session_list.html'
|
template_name = 'terminal/session_list.html'
|
||||||
context_object_name = 'session_list'
|
context_object_name = 'session_list'
|
||||||
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
|
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
|
||||||
user = asset = system_user = date_from_s = date_to_s = ''
|
user = asset = system_user = ''
|
||||||
|
date_from = date_to = None
|
||||||
date_format = '%m/%d/%Y'
|
date_format = '%m/%d/%Y'
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
date_to_default = timezone.now()
|
|
||||||
date_from_default = timezone.now() - timezone.timedelta(7)
|
|
||||||
date_to_default_s = date_to_default.strftime(self.date_format)
|
|
||||||
date_from_default_s = date_from_default.strftime(self.date_format)
|
|
||||||
|
|
||||||
self.queryset = super().get_queryset()
|
self.queryset = super().get_queryset()
|
||||||
self.user = self.request.GET.get('user')
|
self.user = self.request.GET.get('user')
|
||||||
self.asset = self.request.GET.get('asset')
|
self.asset = self.request.GET.get('asset')
|
||||||
self.system_user = self.request.GET.get('system_user')
|
self.system_user = self.request.GET.get('system_user')
|
||||||
self.date_from_s = self.request.GET.get('date_from', date_from_default_s)
|
|
||||||
self.date_to_s = self.request.GET.get('date_to', date_to_default_s)
|
|
||||||
|
|
||||||
filter_kwargs = {}
|
filter_kwargs = dict()
|
||||||
if self.date_from_s:
|
filter_kwargs['date_start__gt'] = self.date_from
|
||||||
date_from = datetime.strptime(self.date_from_s, self.date_format)
|
filter_kwargs['date_start__lt'] = self.date_to
|
||||||
date_from = date_from.replace(tzinfo=timezone.get_current_timezone())
|
|
||||||
filter_kwargs['date_start__gt'] = date_from
|
|
||||||
if self.date_to_s:
|
|
||||||
date_to = timezone.datetime.strptime(
|
|
||||||
self.date_to_s + ' 23:59:59', '%m/%d/%Y %H:%M:%S')
|
|
||||||
date_to = date_to.replace(tzinfo=timezone.get_current_timezone())
|
|
||||||
filter_kwargs['date_start__lt'] = date_to
|
|
||||||
if self.user:
|
if self.user:
|
||||||
filter_kwargs['user'] = self.user
|
filter_kwargs['user'] = self.user
|
||||||
if self.asset:
|
if self.asset:
|
||||||
|
@ -76,8 +57,8 @@ class SessionListView(AdminUserRequiredMixin, ListView):
|
||||||
'user_list': utils.get_user_list_from_cache(),
|
'user_list': utils.get_user_list_from_cache(),
|
||||||
'asset_list': utils.get_asset_list_from_cache(),
|
'asset_list': utils.get_asset_list_from_cache(),
|
||||||
'system_user_list': utils.get_system_user_list_from_cache(),
|
'system_user_list': utils.get_system_user_list_from_cache(),
|
||||||
'date_from': self.date_from_s,
|
'date_from': self.date_from,
|
||||||
'date_to': self.date_to_s,
|
'date_to': self.date_to,
|
||||||
'username': self.user,
|
'username': self.user,
|
||||||
'asset': self.asset,
|
'asset': self.asset,
|
||||||
'system_user': self.system_user,
|
'system_user': self.system_user,
|
||||||
|
|
|
@ -56,7 +56,7 @@
|
||||||
<script src="{% static 'js/plugins/datepicker/bootstrap-datepicker.js' %}"></script>
|
<script src="{% static 'js/plugins/datepicker/bootstrap-datepicker.js' %}"></script>
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
|
|
||||||
$('.input-group.date').datepicker({
|
$('.input-group.date').datepicker({
|
||||||
format: "yyyy-mm-dd",
|
format: "yyyy-mm-dd",
|
||||||
|
|
|
@ -17,9 +17,10 @@
|
||||||
<div class="form-group" id="date">
|
<div class="form-group" id="date">
|
||||||
<div class="input-daterange input-group" id="datepicker">
|
<div class="input-daterange input-group" id="datepicker">
|
||||||
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
|
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
|
||||||
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_from" value="{{ date_from }}">
|
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_from" value="{{ date_from|date:"m/d/Y"}}">
|
||||||
|
{# <input type="text" class="input-sm form-control" style="width: 100px;" name="date_from" >#}
|
||||||
<span class="input-group-addon">to</span>
|
<span class="input-group-addon">to</span>
|
||||||
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_to" value="{{ date_to }}">
|
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_to" value="{{ date_to|date:"m/d/Y"}}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
|
@ -80,10 +81,11 @@
|
||||||
"order": []
|
"order": []
|
||||||
});
|
});
|
||||||
$('#date .input-daterange').datepicker({
|
$('#date .input-daterange').datepicker({
|
||||||
dateFormat: 'mm/dd/yy',
|
dateFormat: "mm/dd/yyy",
|
||||||
keyboardNavigation: false,
|
keyboardNavigation: false,
|
||||||
forceParse: false,
|
forceParse: false,
|
||||||
autoclose: true
|
autoclose: true
|
||||||
|
|
||||||
});
|
});
|
||||||
$('.select2').select2({
|
$('.select2').select2({
|
||||||
dropdownAutoWidth: true
|
dropdownAutoWidth: true
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
{% block custom_foot_js %}
|
{% block custom_foot_js %}
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
}).on('click', '.field-tag', function() {
|
}).on('click', '.field-tag', function() {
|
||||||
changeField(this);
|
changeField(this);
|
||||||
}).on('click', '#change_all', function () {
|
}).on('click', '#change_all', function () {
|
||||||
|
|
|
@ -253,7 +253,7 @@ function updateUserGroups(groups) {
|
||||||
}
|
}
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
$('.select2').select2()
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
.on('select2:select', function(evt) {
|
.on('select2:select', function(evt) {
|
||||||
var data = evt.params.data;
|
var data = evt.params.data;
|
||||||
jumpserver.groups_selected[data.id] = data.text;
|
jumpserver.groups_selected[data.id] = data.text;
|
||||||
|
|
|
@ -98,7 +98,7 @@
|
||||||
{% block custom_foot_js %}
|
{% block custom_foot_js %}
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
var options = {
|
var options = {
|
||||||
ele: $('#user_assets_table'),
|
ele: $('#user_assets_table'),
|
||||||
buttons: [],
|
buttons: [],
|
||||||
|
|
|
@ -57,7 +57,7 @@
|
||||||
{% block custom_foot_js %}
|
{% block custom_foot_js %}
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -150,7 +150,7 @@ function updateGroupMember(users) {
|
||||||
}
|
}
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2()
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
.on('select2:select', function(evt) {
|
.on('select2:select', function(evt) {
|
||||||
var data = evt.params.data;
|
var data = evt.params.data;
|
||||||
jumpserver.users_selected[data.id] = data.text;
|
jumpserver.users_selected[data.id] = data.text;
|
||||||
|
|
|
@ -102,7 +102,7 @@
|
||||||
{% block custom_foot_js %}
|
{% block custom_foot_js %}
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2({ dropdownAutoWidth : true, width: 'auto' });
|
||||||
var options = {
|
var options = {
|
||||||
ele: $('#user_assets_table'),
|
ele: $('#user_assets_table'),
|
||||||
buttons: [],
|
buttons: [],
|
||||||
|
|
|
@ -22,6 +22,7 @@ from django.conf import settings
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
from common.utils import get_object_or_none
|
from common.utils import get_object_or_none
|
||||||
|
from common.mixins import DatetimeSearchMixin
|
||||||
from ..models import User, LoginLog
|
from ..models import User, LoginLog
|
||||||
from ..utils import send_reset_password_mail
|
from ..utils import send_reset_password_mail
|
||||||
from ..tasks import write_login_log_async
|
from ..tasks import write_login_log_async
|
||||||
|
@ -210,55 +211,38 @@ class UserFirstLoginView(LoginRequiredMixin, SessionWizardView):
|
||||||
return form
|
return form
|
||||||
|
|
||||||
|
|
||||||
class LoginLogListView(ListView):
|
class LoginLogListView(DatetimeSearchMixin, ListView):
|
||||||
template_name = 'users/login_log_list.html'
|
template_name = 'users/login_log_list.html'
|
||||||
model = LoginLog
|
model = LoginLog
|
||||||
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
|
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
|
||||||
username = keyword = date_from_s = date_to_s = ""
|
username = keyword = ""
|
||||||
|
date_to = date_from = None
|
||||||
date_format = '%m/%d/%Y'
|
date_format = '%m/%d/%Y'
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
date_to_default = timezone.now()
|
|
||||||
date_from_default = timezone.now() - timezone.timedelta(7)
|
|
||||||
date_to_default_s = date_to_default.strftime(self.date_format)
|
|
||||||
date_from_default_s = date_from_default.strftime(self.date_format)
|
|
||||||
|
|
||||||
self.username = self.request.GET.get('username', '')
|
self.username = self.request.GET.get('username', '')
|
||||||
self.keyword = self.request.GET.get("keyword", '')
|
self.keyword = self.request.GET.get("keyword", '')
|
||||||
self.date_from_s = self.request.GET.get('date_from', date_from_default_s)
|
|
||||||
self.date_to_s = self.request.GET.get('date_to', date_to_default_s)
|
|
||||||
|
|
||||||
self.queryset = super().get_queryset()
|
queryset = super().get_queryset()
|
||||||
|
queryset = queryset.filter(
|
||||||
|
datetime__gt=self.date_from, datetime__lt=self.date_to
|
||||||
|
)
|
||||||
if self.username:
|
if self.username:
|
||||||
self.queryset = self.queryset.filter(username=self.username)
|
queryset = self.queryset.filter(username=self.username)
|
||||||
if self.date_from_s:
|
|
||||||
date_from = timezone.datetime.strptime(self.date_from_s, '%m/%d/%Y')
|
|
||||||
date_from = date_from.replace(
|
|
||||||
tzinfo=timezone.get_current_timezone()
|
|
||||||
)
|
|
||||||
self.queryset = self.queryset.filter(datetime__gt=date_from)
|
|
||||||
if self.date_to_s:
|
|
||||||
date_to = timezone.datetime.strptime(
|
|
||||||
self.date_to_s + ' 23:59:59', '%m/%d/%Y %H:%M:%S'
|
|
||||||
)
|
|
||||||
date_to = date_to.replace(
|
|
||||||
tzinfo=timezone.get_current_timezone()
|
|
||||||
)
|
|
||||||
self.queryset = self.queryset.filter(datetime__lt=date_to)
|
|
||||||
if self.keyword:
|
if self.keyword:
|
||||||
self.queryset = self.queryset.filter(
|
queryset = self.queryset.filter(
|
||||||
Q(ip__contains=self.keyword) |
|
Q(ip__contains=self.keyword) |
|
||||||
Q(city__contains=self.keyword) |
|
Q(city__contains=self.keyword) |
|
||||||
Q(username__contains=self.keyword)
|
Q(username__contains=self.keyword)
|
||||||
)
|
)
|
||||||
return self.queryset
|
return queryset
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = {
|
context = {
|
||||||
'app': _('Users'),
|
'app': _('Users'),
|
||||||
'action': _('Login log list'),
|
'action': _('Login log list'),
|
||||||
'date_from': self.date_from_s,
|
'date_from': self.date_from,
|
||||||
'date_to': self.date_to_s,
|
'date_to': self.date_to,
|
||||||
'username': self.username,
|
'username': self.username,
|
||||||
'keyword': self.keyword,
|
'keyword': self.keyword,
|
||||||
'user_list': set(LoginLog.objects.all().values_list('username', flat=True))
|
'user_list': set(LoginLog.objects.all().values_list('username', flat=True))
|
||||||
|
|
Loading…
Reference in New Issue