From f00da207649924820c61192e7a96d25610e71a10 Mon Sep 17 00:00:00 2001 From: xiaoyu <763691951@qq.com> Date: Mon, 19 Sep 2016 15:47:58 +0800 Subject: [PATCH] user-group delete implement --- apps/common/mixins.py | 38 ++++++++++++++ apps/users/api.py | 7 ++- apps/users/models.py | 46 +++++++++-------- apps/users/serializers.py | 8 ++- .../templates/users/user_group_list.html | 51 +++++++++++++++++-- apps/users/urls.py | 6 +-- 6 files changed, 126 insertions(+), 30 deletions(-) create mode 100644 apps/common/mixins.py diff --git a/apps/common/mixins.py b/apps/common/mixins.py new file mode 100644 index 000000000..997f2fbba --- /dev/null +++ b/apps/common/mixins.py @@ -0,0 +1,38 @@ +# coding: utf-8 + +from django.db import models +from django.utils.timezone import now +from django.utils.translation import ugettext_lazy as _ + + +class NoDeleteQuerySet(models.query.QuerySet): + + def delete(self): + return self.update(is_discard=True, discard_time=now()) + + +class NoDeleteManager(models.Manager): + + def get_all(self): + return NoDeleteQuerySet(self.model, using=self._db) + + def get_queryset(self): + return NoDeleteQuerySet(self.model, using=self._db).filter(is_discard=False) + + def get_deleted(self): + return NoDeleteQuerySet(self.model, using=self._db).filter(is_discard=True) + + +class NoDeleteModelMixin(models.Model): + is_discard = models.BooleanField(verbose_name=_("is discard"), default=False) + discard_time = models.DateTimeField(verbose_name=_("discard time"), null=True, blank=True) + + objects = NoDeleteManager() + + class Meta: + abstract = True + + def delete(self): + self.is_discard = True + self.discard_time = now() + return self.save() diff --git a/apps/users/api.py b/apps/users/api.py index 39044d2e7..2f683dcb6 100644 --- a/apps/users/api.py +++ b/apps/users/api.py @@ -6,7 +6,7 @@ import logging from rest_framework import generics from .serializers import UserSerializer, UserGroupSerializer, UserAttributeSerializer, UserGroupEditSerializer, \ - UserPKUpdateSerializer + GroupEditSerializer, UserPKUpdateSerializer from .models import User, UserGroup @@ -87,3 +87,8 @@ class UserUpdatePKApi(generics.UpdateAPIView): user = self.get_object() user.private_key = serializer.validated_data['_public_key'] user.save() + + +class GroupDeleteApi(generics.DestroyAPIView): + queryset = UserGroup.objects.all() + serializer_class = GroupEditSerializer diff --git a/apps/users/models.py b/apps/users/models.py index da29568bc..88d5ebdd3 100644 --- a/apps/users/models.py +++ b/apps/users/models.py @@ -4,19 +4,22 @@ from __future__ import unicode_literals from django.conf import settings from django.contrib.auth.hashers import make_password +from django.utils import timezone +from django.db import models from django.contrib.auth.models import AbstractUser -from django.core import signing -from django.db import models, IntegrityError from django.db.models.signals import post_save from django.dispatch import receiver -from django.utils import timezone +from django.db import IntegrityError from django.utils.translation import ugettext_lazy as _ +from django.core import signing + from rest_framework.authtoken.models import Token from common.utils import encrypt, decrypt, date_expired_default +from common.mixins import NoDeleteModelMixin -class UserGroup(models.Model): +class UserGroup(NoDeleteModelMixin): name = models.CharField(max_length=100, unique=True, verbose_name=_('Name')) comment = models.TextField(blank=True, verbose_name=_('Comment')) date_created = models.DateTimeField(auto_now_add=True) @@ -30,14 +33,20 @@ class UserGroup(models.Model): return True return False + def delete(self): + if self.name != 'Default': + self.users.clear() + return super(UserGroup, self).delete() + return True + class Meta: - db_table = 'user_group' + db_table = 'user-group' @classmethod def initial(cls): - group_or_create = cls.objects.get_or_create(name='Default', comment='Default user group for all user', - created_by='System') - return group_or_create[0] + group, created = cls.objects.get_or_create(name='Default', comment='Default user group for all user', + created_by='System') + return group @classmethod def generate_fake(cls, count=100): @@ -48,8 +57,7 @@ class UserGroup(models.Model): for i in range(count): group = cls(name=forgery_py.name.full_name(), comment=forgery_py.lorem_ipsum.sentence(), - created_by=choice(User.objects.all()).username - ) + created_by=choice(User.objects.all()).username) try: group.save() except IntegrityError: @@ -76,11 +84,10 @@ class User(AbstractUser): _private_key = models.CharField(max_length=5000, blank=True, verbose_name=_('ssh private key')) _public_key = models.CharField(max_length=1000, blank=True, verbose_name=_('ssh public key')) comment = models.TextField(max_length=200, blank=True, verbose_name=_('Comment')) - is_first_login = models.BooleanField(default=True) + is_first_login = models.BooleanField(default=False) date_expired = models.DateTimeField(default=date_expired_default, blank=True, null=True, verbose_name=_('Date expired')) created_by = models.CharField(max_length=30, default='', verbose_name=_('Created by')) - is_public_key_valid = models.BooleanField(default=False) @property def password_raw(self): @@ -144,17 +151,13 @@ class User(AbstractUser): pass def save(self, *args, **kwargs): - # If user not set name, it's default equal username if not self.name: self.name = self.username super(User, self).save(*args, **kwargs) - # Set user default group 'All' - # Todo: It's have bug + # Add the current user to the default group. group = UserGroup.initial() - if group not in self.groups.all(): - self.groups.add(group) - # super(User, self).save(*args, **kwargs) + self.groups.add(group) @property def private_token(self): @@ -227,8 +230,7 @@ class User(AbstractUser): role=choice(dict(User.ROLE_CHOICES).keys()), wechat=forgery_py.internet.user_name(True), comment=forgery_py.lorem_ipsum.sentence(), - created_by=choice(cls.objects.all()).username, - ) + created_by=choice(cls.objects.all()).username) try: user.save() except IntegrityError: @@ -240,13 +242,13 @@ class User(AbstractUser): def init_all_models(): for model in (UserGroup, User): - if hasattr(model, b'initial'): + if hasattr(model, 'initial'): model.initial() def generate_fake(): for model in (UserGroup, User): - if hasattr(model, b'generate_fake'): + if hasattr(model, 'generate_fake'): model.generate_fake() diff --git a/apps/users/serializers.py b/apps/users/serializers.py index 06db1b95e..8e117a90d 100644 --- a/apps/users/serializers.py +++ b/apps/users/serializers.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- # - from django.utils.translation import ugettext_lazy as _ from rest_framework import serializers @@ -27,6 +26,13 @@ class UserGroupSerializer(serializers.ModelSerializer): fields = '__all__' +class GroupEditSerializer(serializers.ModelSerializer): + + class Meta: + model = UserGroup + fields = ['id', 'name', 'comment', 'date_created', 'created_by'] + + class UserAttributeSerializer(serializers.ModelSerializer): class Meta: diff --git a/apps/users/templates/users/user_group_list.html b/apps/users/templates/users/user_group_list.html index 9449e1e3a..8294a238f 100644 --- a/apps/users/templates/users/user_group_list.html +++ b/apps/users/templates/users/user_group_list.html @@ -1,5 +1,10 @@ {% extends '_list_base.html' %} -{% load i18n %} +{% load i18n static %} +{% block custom_head_css_js %} + + +{% endblock %} + {% block content_left_head %} {% trans "Add User Group" %} {% endblock %} @@ -30,8 +35,9 @@