Как реализовать доступ пользователей на основе лицензий с использованием настраиваемых разрешений и APIView?

Имею следующие модели.

class Post(models.Model):
    content = models.TextField()

class User(AbstractUser):
    pen_name = models.Charfield()    

Я хочу ограничить пользователя созданием определенного количества сообщений (скажем, 10) и не более того. Кроме того, я хочу, чтобы срок действия разрешения истек к определенной дате.

Эти модели являются репрезентативными, в моих исходных моделях гораздо больше полей и требуется гораздо больше разрешений. Но для всего этого мне в основном нужно ограничить количество и срок годности. Я хочу иметь возможность лицензирования с помощью разрешений. Таким образом, пользователь может приобрести лицензию на публикацию n сообщений в год.

Как мне добиться этого для APIViews и разрешений_classes в DRF?


comment
Почему вы не используете разрешения DRF?   -  person JPG    schedule 21.09.2020
comment
@ArakkalAbu В разрешениях DRF, как я могу сохранить дату истечения срока действия для каждого пользователя и разрешенное количество сообщений для каждого пользователя. Поскольку это может быть разным для каждого пользователя. Вот почему я хотел использовать разрешения Django.   -  person Vikramark    schedule 21.09.2020
comment
Сохраните владельца сообщения и время создания сообщения в Post модели. Вы можете запросить эти значения, чтобы проверить условия   -  person JPG    schedule 21.09.2020
comment
Срок действия также может быть разным для всех пользователей. Поскольку я хочу, чтобы разрешения вели себя больше как лицензия. Как пользователь может приобрести лицензию на публикацию n сообщений в год.   -  person Vikramark    schedule 21.09.2020


Ответы (2)


Вы можете добавить поле (post_number) для своего пользовательского User, и это поле может быть IntegerField или PositiveIntegerField, и вы можете сделать его ограничено.

Как создать дату истечения срока в моем модель django?

class User(AbstractBaseUser, PermissionsMixin):
    post_number = models.IntegerField()
    expiration_date = models.DateTimeField()

    more_restrictions = models.ManyToManyField(MyRestrictionModel)

    # rest of your code...

Для получения дополнительных ограничений вы можете установить связь с MyRestrictionModel, и всякий раз, когда вы добавляете поле в MyRestrictionModel, ваш User будет ограничен.

person adnan kaya    schedule 21.09.2020
comment
Так что номер поста - это только одно из ограничений. У меня есть более сложные модели, которые могут потребоваться для динамического добавления некоторых разрешений. Итак, мне нужен способ сохранить счетчик и дату истечения срока действия разрешения. Я обновлю свой вопрос, чтобы упомянуть об этом. - person Vikramark; 21.09.2020
comment
Я обновил свой ответ. Надеюсь, это может быть полезно. @Vikramark - person adnan kaya; 21.09.2020
comment
Это было очень полезно - person Vikramark; 21.09.2020

Для лицензий вы можете создать лицензионную модель.

class License(models.Model):
    code = models.Charfield()
    count = models.Integerfield()
    #other fields for license information

а затем вы можете иметь лицензии в ManyToManyField для модели User

class User(models.Model):
    ...
    licenses = models.ManyToManyField(License)
    ...

Вы также можете добавить сквозную модель для отношения M2M для хранения других деталей, таких как дата покупки лицензии, срок действия, запись транзакции и т. Д.

А затем в APIViews вы можете использовать настраиваемый класс разрешений DRF

class MyPermissionClass(permissions.BasePermission):
    def has_permission(self, request, view):
        #process user's licenses to check permissions
class MyView(APIView):
    permission_classes = [MyPermissionClass,]
person Vikramark    schedule 21.09.2020