diff --git a/apps/assets/forms.py b/apps/assets/forms.py index f2f28ad46..ca7b1670f 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -45,6 +45,9 @@ class AssetGroupForm(forms.ModelForm): fields = [ "name", "comment" ] + help_texts = { + 'name': '* required', + } class IdcForm(forms.ModelForm): diff --git a/apps/assets/hands.py b/apps/assets/hands.py new file mode 100644 index 000000000..e87060ecd --- /dev/null +++ b/apps/assets/hands.py @@ -0,0 +1,14 @@ +""" + jumpserver.__app__.hands.py + ~~~~~~~~~~~~~~~~~ + + This app depends other apps api, function .. should be import or write mack here. + + Other module of this app shouldn't connect with other app. + + :copyright: (c) 2014-2016 by Jumpserver Team. + :license: GPL v2, see LICENSE for more details. +""" + + + diff --git a/apps/assets/models.py b/apps/assets/models.py index 3fd399a26..3e4c224cf 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -165,6 +165,25 @@ class Asset(models.Model): db_table = 'asset' index_together = ('ip', 'port') + @classmethod + def generate_fake(cls, count=100): + from random import seed + import forgery_py + from django.db import IntegrityError + + seed() + for i in range(count): + asset = cls(ip='%s.%s.%s.%s' % tuple([forgery_py.forgery.basic.text(length=3, digits=True) + for i in range(0, 4)]), + port=22, + created_by='Fake') + try: + asset.save() + logger.debug('Generate fake asset : %s' % asset.ip) + except IntegrityError: + print('Error continue') + continue + class Label(models.Model): key = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('KEY')) diff --git a/apps/assets/templates/assets/asset_group_detail.html b/apps/assets/templates/assets/asset_group_detail.html index 643f7608d..08272a04f 100644 --- a/apps/assets/templates/assets/asset_group_detail.html +++ b/apps/assets/templates/assets/asset_group_detail.html @@ -69,7 +69,7 @@
- {{ asset_group.name }} + {% trans 'Asset list of ' %} {{ asset_group.name }}
- +
+ + + + + + + + - - - - - - - - - - - - - - - - + {% for asset in page_obj %} + + + + + + + {% endfor %}
{% trans 'Hostname' %}{% trans 'IP' %}{% trans 'Port' %}{% trans 'Alive' %}
{% trans 'Name' %}:{{ asset_group.name }}
{% trans 'Date created' %}:{{ asset_group.date_created }}
{% trans 'Created by' %}:{{ asset_group.created_by }}
{% trans 'Comment' %}:{{ asset_group.comment }}
{{ asset.hostname }}{{ asset.ip }}{{ asset.port }}Alive
+
+ {% include '_pagination.html' %} +
@@ -129,17 +132,9 @@
- - - - - - {% for group in groups %} {% endfor %} @@ -164,6 +159,43 @@ + +
+
+ {% trans 'Add asset to this group' %} +
+
+ + + + + + + + + + + {% for group in user.groups.all %} + + + + + {% endfor %} + +
+ +
+ +
{{ group.name }} + +
+
+
+ diff --git a/apps/assets/views.py b/apps/assets/views.py index a88cafe67..958033e4a 100644 --- a/apps/assets/views.py +++ b/apps/assets/views.py @@ -11,7 +11,7 @@ from django.db.models import Q from django.views.generic import TemplateView, ListView from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView from django.urls import reverse_lazy -from django.views.generic.detail import DetailView +from django.views.generic.detail import DetailView, SingleObjectMixin from .models import Asset, AssetGroup, IDC, AssetExtend from .forms import AssetForm, AssetGroupForm @@ -56,6 +56,8 @@ class AssetGroupCreateView(CreateView): template_name = 'assets/asset_group_create.html' success_url = reverse_lazy('assets:asset-group-list') + # Todo: Asset group create template select assets so hard, need be resolve next + def get_context_data(self, **kwargs): context = { 'app': _('Assets'), @@ -99,15 +101,22 @@ class AssetGroupListView(ListView): return self.queryset -class AssetGroupDetailView(DetailView): +class AssetGroupDetailView(SingleObjectMixin, ListView): template_name = 'assets/asset_group_detail.html' - model = AssetGroup - context_object_name = 'asset_group' + paginate_by = settings.CONFIG.DISPLAY_PER_PAGE + + def get(self, request, *args, **kwargs): + self.object = self.get_object(queryset=AssetGroup.objects.all()) + return super(AssetGroupDetailView, self).get(request, *args, **kwargs) + + def get_queryset(self): + return self.object.assets.all() def get_context_data(self, **kwargs): context = { 'app': _('Assets'), - 'action': _('Asset group detail') + 'action': _('Asset group detail'), + 'asset_group': self.object, } kwargs.update(context) return super(AssetGroupDetailView, self).get_context_data(**kwargs) diff --git a/apps/users/hands.py b/apps/users/hands.py new file mode 100644 index 000000000..e87060ecd --- /dev/null +++ b/apps/users/hands.py @@ -0,0 +1,14 @@ +""" + jumpserver.__app__.hands.py + ~~~~~~~~~~~~~~~~~ + + This app depends other apps api, function .. should be import or write mack here. + + Other module of this app shouldn't connect with other app. + + :copyright: (c) 2014-2016 by Jumpserver Team. + :license: GPL v2, see LICENSE for more details. +""" + + + diff --git a/apps/users/urls.py b/apps/users/urls.py index 9b8025849..7f8045338 100644 --- a/apps/users/urls.py +++ b/apps/users/urls.py @@ -16,6 +16,7 @@ urlpatterns = [ name='reset-password-success'), url(r'^user$', views.UserListView.as_view(), name='user-list'), url(r'^user/(?P[0-9]+)$', views.UserDetailView.as_view(), name='user-detail'), + url(r'^user/(?P[0-9]+)/assets-perm$', views.UserDetailView.as_view(), name='user-detail'), url(r'^user/create$', views.UserCreateView.as_view(), name='user-create'), url(r'^user/(?P[0-9]+)/update$', views.UserUpdateView.as_view(), name='user-update'), url(r'^user/(?P[0-9]+)/delete$', views.UserDeleteView.as_view(), name='user-delete'),