diff --git a/apps/common/utils.py b/apps/common/utils.py
index 4451f2532..f6cb9ea9a 100644
--- a/apps/common/utils.py
+++ b/apps/common/utils.py
@@ -6,6 +6,7 @@ from __future__ import unicode_literals
from django.shortcuts import reverse as dj_reverse
from django.conf import settings
from django.core import signing
+from django.utils import timezone
def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None, external=False):
@@ -31,3 +32,11 @@ def encrypt(*args, **kwargs):
def decrypt(*args, **kwargs):
return signing.loads(*args, **kwargs)
+
+def date_expired_default():
+ try:
+ years = int(settings.CONFIG.DEFAULT_EXPIRED_YEARS)
+ except TypeError:
+ years = 70
+
+ return timezone.now() + timezone.timedelta(days=365 * years)
\ No newline at end of file
diff --git a/apps/perms/forms.py b/apps/perms/forms.py
new file mode 100644
index 000000000..83f9fe65b
--- /dev/null
+++ b/apps/perms/forms.py
@@ -0,0 +1,17 @@
+# ~*~ coding: utf-8 ~*~
+
+from __future__ import absolute_import, unicode_literals
+from django import forms
+from django.utils.translation import ugettext_lazy as _
+
+from users.models import User, UserGroup
+from assets.models import Asset, AssetGroup, SystemUser
+from .models import UserAssetPerm
+
+
+class UserAssetPermForm(forms.ModelForm):
+ class Meta:
+ model = UserAssetPerm
+ fields = [
+ 'assets', 'asset_groups', 'system_users', 'date_expired', 'comment'
+ ]
diff --git a/apps/perms/hands.py b/apps/perms/hands.py
new file mode 100644
index 000000000..e4d282927
--- /dev/null
+++ b/apps/perms/hands.py
@@ -0,0 +1,11 @@
+# ~*~ coding: utf-8 ~*~
+#
+
+from django.db import models
+from django.utils.translation import ugettext_lazy as _
+
+
+
+
+
+
diff --git a/apps/perms/models.py b/apps/perms/models.py
index bd4b2abe9..85c8b4672 100644
--- a/apps/perms/models.py
+++ b/apps/perms/models.py
@@ -1,5 +1,23 @@
-from __future__ import unicode_literals
+from __future__ import unicode_literals, absolute_import
from django.db import models
+from django.utils.translation import ugettext_lazy as _
-# Create your models here.
+from users.models import User, UserGroup
+from assets.models import Asset, AssetGroup, SystemUser
+from common.utils import date_expired_default
+
+
+class UserAssetPerm(models.Model):
+ user = models.ForeignKey(User, related_name='asset_perm', on_delete=models.CASCADE)
+ assets = models.ManyToManyField(Asset, related_name='user_perms', blank=True)
+ asset_groups = models.ManyToManyField(AssetGroup, related_name='user_perm', blank=True)
+ system_users = models.ManyToManyField(SystemUser, related_name='user_perm', blank=True)
+ date_expired = models.DateTimeField(default=date_expired_default, verbose_name=_('Date expired'))
+ created_by = models.CharField(max_length=128)
+ date_created = models.DateTimeField(auto_now=True)
+ comment = models.TextField(verbose_name=_('Comment'))
+
+
+class UserGroupAssetPerm(models.Model):
+ pass
diff --git a/apps/perms/views.py b/apps/perms/views.py
index 91ea44a21..166d9e6f3 100644
--- a/apps/perms/views.py
+++ b/apps/perms/views.py
@@ -1,3 +1,100 @@
-from django.shortcuts import render
+# ~*~ coding: utf-8 ~*~
-# Create your views here.
+from __future__ import unicode_literals, absolute_import
+
+from django.views.generic.list import ListView
+from django.conf import settings
+
+from .hands import AdminUserRequiredMixin
+from .models import UserAssetPerm, UserGroupAssetPerm
+
+
+class SystemUserListView(AdminUserRequiredMixin, ListView):
+ model = UserAssetPerm
+ paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
+ context_object_name = 'system_user_list'
+ template_name = 'assets/system_user_list.html'
+
+ def get_context_data(self, **kwargs):
+ context = {
+ 'app': _('Assets'),
+ 'action': _('System user list'),
+ 'keyword': self.request.GET.get('keyword', '')
+ }
+ kwargs.update(context)
+ return super(SystemUserListView, self).get_context_data(**kwargs)
+
+ def get_queryset(self):
+ # Todo: Default order by lose asset connection num
+ self.queryset = super(SystemUserListView, self).get_queryset()
+ self.keyword = keyword = self.request.GET.get('keyword', '')
+ self.sort = sort = self.request.GET.get('sort', '-date_created')
+
+ if keyword:
+ self.queryset = self.queryset.filter(Q(name__icontains=keyword) |
+ Q(comment__icontains=keyword))
+
+ if sort:
+ self.queryset = self.queryset.order_by(sort)
+ return self.queryset
+
+
+class SystemUserCreateView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView):
+ model = SystemUser
+ form_class = SystemUserForm
+ template_name = 'assets/system_user_create_update.html'
+ success_url = reverse_lazy('assets:system-user-list')
+ success_message = _('Create system user %s successfully.')
+
+ def get_context_data(self, **kwargs):
+ context = {
+ 'app': _('Assets'),
+ 'action': _('Create system user'),
+ }
+ kwargs.update(context)
+ return super(SystemUserCreateView, self).get_context_data(**kwargs)
+
+ def get_success_message(self, cleaned_data):
+ return self.success_message % (
+ reverse_lazy('assets:system-user-detail', kwargs={'pk': self.object.pk}),
+ self.object.name,
+ )
+
+
+class SystemUserUpdateView(AdminUserRequiredMixin, UpdateView):
+ model = SystemUser
+ form_class = SystemUserForm
+ template_name = 'assets/system_user_create_update.html'
+ success_message = _('Update system user %s successfully.')
+
+ def get_context_data(self, **kwargs):
+ context = {
+ 'app': _('Assets'),
+ 'action': _('Update system user')
+ }
+ kwargs.update(context)
+ return super(SystemUserUpdateView, self).get_context_data(**kwargs)
+
+ def get_success_url(self):
+ success_url = reverse_lazy('assets:system-user-detail', pk=self.object.pk)
+ return success_url
+
+
+class SystemUserDetailView(AdminUserRequiredMixin, DetailView):
+ template_name = 'assets/system_user_detail.html'
+ context_object_name = 'system_user'
+ model = SystemUser
+
+ def get_context_data(self, **kwargs):
+ context = {
+ 'app': _('Assets'),
+ 'action': _('System user detail')
+ }
+ kwargs.update(context)
+ return super(SystemUserDetailView, self).get_context_data(**kwargs)
+
+
+class SystemUserDeleteView(AdminUserRequiredMixin, DeleteView):
+ model = SystemUser
+ template_name = 'assets/delete_confirm.html'
+ success_url = 'assets:system-user-list'
diff --git a/apps/users/hands.py b/apps/users/hands.py
index e87060ecd..c24f183d7 100644
--- a/apps/users/hands.py
+++ b/apps/users/hands.py
@@ -10,5 +10,5 @@
:license: GPL v2, see LICENSE for more details.
"""
-
+from users.utils import AdminUserRequiredMixin
diff --git a/apps/users/models.py b/apps/users/models.py
index fba66a8d8..80a5b51da 100644
--- a/apps/users/models.py
+++ b/apps/users/models.py
@@ -14,7 +14,7 @@ from django.utils.translation import ugettext_lazy as _
from rest_framework.authtoken.models import Token
-from common.utils import encrypt, decrypt
+from common.utils import encrypt, decrypt, date_expired_default
class UserGroup(models.Model):
@@ -58,10 +58,6 @@ class UserGroup(models.Model):
continue
-def date_expired_default():
- return timezone.now() + timezone.timedelta(days=365 * 70)
-
-
class User(AbstractUser):
ROLE_CHOICES = (
('Admin', _('Administrator')),