diff options
author | 2018-11-29 12:27:07 -0800 | |
---|---|---|
committer | 2018-11-29 21:27:07 +0100 | |
commit | 9b0eeff865bb39454f201eb82b460fdc27899a90 (patch) | |
tree | 02581ab033d8a6485861b97384a520953a56aa71 /api/models.py | |
parent | Added regex validator to special snake name. (#153) (diff) |
Django - Add Infractions API (#149)
* add Infraction model and serialiser
The model in not finalised.
* fix mix up of serialiser fields
* remove explicit id field and add foreign keys
* remove unused import
* disallow null for user
* add view set and route
* fix model and create migration
* fix typo choice => choices
* specify names for reverse accessors for User FKs
* add django-filter
* add filters to view set
* add string dunder method to model
* add list/retrieve tests
* make reason nullable
* add creation tests
* remove support for PUT and DELETE
* add support for PATCH
* assert timestamps using strings rather than datetimes
This is done to keep 3.6 support; datetime.fromisoformat() is 3.7+
* assert inserted_at
* add unauthenticated tests
* add bad value tests for list filters and retrieve
* remove prefetch cache invalidation
* make __str__ more descriptive
* add field validation & remove note type
* add tests for field validation
* fix coverage for Infraction string dunder test
* fix coverage (for sure this time)
* return 400 for partial updates with frozen fields
* add expanded serialiser and endpoints
* test expanded endpoints
* remove extra retrieve call
* remove unnecessary try-finally blocks
* remove extra blank line
* document endpoints (except expanded)
* document expanded routes
* fix wrong routes in docstring (/infraction -> /infractions)
* make merge migration
Diffstat (limited to 'api/models.py')
-rw-r--r-- | api/models.py | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/api/models.py b/api/models.py index c67f558d..3387e9be 100644 --- a/api/models.py +++ b/api/models.py @@ -235,3 +235,63 @@ class Tag(ModelReprMixin, models.Model): def __str__(self): return self.title + + +class Infraction(ModelReprMixin, models.Model): + """An infraction for a Discord user.""" + + TYPE_CHOICES = ( + ("warning", "Warning"), + ("mute", "Mute"), + ("ban", "Ban"), + ("kick", "Kick"), + ("superstar", "Superstar") + ) + inserted_at = models.DateTimeField( + auto_now_add=True, + help_text="The date and time of the creation of this infraction." + ) + expires_at = models.DateTimeField( + null=True, + help_text=( + "The date and time of the expiration of this infraction. " + "Null if the infraction is permanent or it can't expire." + ) + ) + active = models.BooleanField( + default=True, + help_text="Whether the infraction is still active." + ) + user = models.ForeignKey( + User, + on_delete=models.CASCADE, + related_name='infractions_received', + help_text="The user to which the infraction was applied." + ) + actor = models.ForeignKey( + User, + on_delete=models.CASCADE, + related_name='infractions_given', + help_text="The user which applied the infraction." + ) + type = models.CharField( + max_length=9, + choices=TYPE_CHOICES, + help_text="The type of the infraction." + ) + reason = models.TextField( + null=True, + help_text="The reason for the infraction." + ) + hidden = models.BooleanField( + default=False, + help_text="Whether the infraction is a shadow infraction." + ) + + def __str__(self): + s = f"#{self.id}: {self.type} on {self.user_id}" + if self.expires_at: + s += f" until {self.expires_at}" + if self.hidden: + s += " (hidden)" + return s |