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 }}
-
+
+
+
+ {% 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 }} |
-
+ {% for asset in page_obj %}
+
+ {{ asset.hostname }} |
+ {{ asset.ip }} |
+ {{ asset.port }} |
+ Alive |
+
+ {% endfor %}
+
+ {% include '_pagination.html' %}
+
@@ -129,17 +132,9 @@
+
+
+
+ {% trans 'Add asset to this group' %}
+
+
+
+
+
+ {% for group in user.groups.all %}
+
+ {{ group.name }} |
+
+
+ |
+
+ {% endfor %}
+
+
+
+
+
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'),