134 lines
4.5 KiB
Python
134 lines
4.5 KiB
Python
import os
|
|
|
|
from django.db import models
|
|
from django.contrib.postgres.fields import ArrayField
|
|
from django.core.exceptions import ObjectDoesNotExist
|
|
from rest_framework import status
|
|
|
|
from .utils import create_error_response
|
|
from .utils import create_success_response
|
|
from .utils import create_role_success_response
|
|
|
|
|
|
# Create your models here.
|
|
|
|
|
|
class Guild(models.Model):
|
|
id = models.CharField(max_length=30, primary_key=True)
|
|
new_patron_message = models.TextField(max_length=1000, blank=True, null=True)
|
|
prefixes = ArrayField(models.CharField(max_length=10))
|
|
|
|
def __str__(self):
|
|
return self.id
|
|
|
|
def update_guild(self, data):
|
|
if data.get('new_patron_message'):
|
|
self.new_patron_message = data.get('new_patron_message')
|
|
if data.get('add_prefix'):
|
|
if data.get('add_prefix') not in self.prefixes:
|
|
self.prefixes.append(data.get('add_prefix'))
|
|
if data.get('remove_prefix'):
|
|
if data.get('remove_prefix') in self.prefixes:
|
|
self.prefixes.remove(data.get('remove_prefix'))
|
|
if len(self.prefixes) <= 0:
|
|
self.prefixes = [os.environ['DISCORD_DEFAULT_PREFIX'], ]
|
|
|
|
self.save()
|
|
return self
|
|
|
|
@classmethod
|
|
def get_guild_by_id(cls, id):
|
|
try:
|
|
return cls.objects.get(id=id)
|
|
except ObjectDoesNotExist:
|
|
return None
|
|
|
|
@classmethod
|
|
def create_guild(cls, data):
|
|
id = data.get('id')
|
|
if not id:
|
|
return create_error_response('ID is required',
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
if cls.get_guild_by_id(id):
|
|
return create_error_response('That Guild already exists',
|
|
status.HTTP_409_CONFLICT)
|
|
|
|
guild = cls(
|
|
id=id,
|
|
prefixes=data.get('prefixes'),
|
|
new_patron_message=data.get('new_patron_message')
|
|
)
|
|
guild.save()
|
|
return create_success_response(guild, status.HTTP_201_CREATED, many=False)
|
|
|
|
|
|
class Role(models.Model):
|
|
id = models.CharField(max_length=30, primary_key=True)
|
|
guild = models.ForeignKey(Guild, on_delete=models.CASCADE, null=False)
|
|
role_type = models.PositiveSmallIntegerField()
|
|
|
|
def update_role(self, data):
|
|
if data.get('role_type'):
|
|
self.role_type = data.get('role_type')
|
|
|
|
self.save()
|
|
return self
|
|
|
|
@classmethod
|
|
def add_new_role(cls, guild_id, data):
|
|
id = data.get('id')
|
|
role_type = data.get('role_type')
|
|
guild = Guild.get_guild_by_id(guild_id)
|
|
if not (id and guild_id and (role_type is not None)):
|
|
return create_error_response("The Role ID, Guild, and Role Type are required",
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
if cls.get_role_by_id(guild_id, id):
|
|
return create_error_response("That Role Already Exists",
|
|
status=status.HTTP_409_CONFLICT)
|
|
if not isinstance(guild, Guild):
|
|
return create_error_response("Guild Does Not Exist",
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
|
|
try:
|
|
role_type = int(role_type)
|
|
except ValueError:
|
|
return create_error_response("Role Type must be a positive number",
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
if role_type < 0:
|
|
return create_error_response("Role Type must be a positive number",
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
elif 1000 < role_type:
|
|
return create_error_response("Role Type must be less than 1000",
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
role = cls(
|
|
id=id,
|
|
guild=guild,
|
|
role_type=role_type
|
|
)
|
|
role.save()
|
|
return create_role_success_response(role, status.HTTP_201_CREATED, many=False)
|
|
|
|
@classmethod
|
|
def get_role_by_id(cls, guild_id, role_id):
|
|
try:
|
|
return cls.get_guild_roles(guild_id).get(id=role_id)
|
|
except ObjectDoesNotExist:
|
|
return None
|
|
|
|
@classmethod
|
|
def get_guild_roles(cls, guild):
|
|
return cls.objects.filter(guild__id=guild)
|
|
|
|
@classmethod
|
|
def get_admin_roles(cls, guild_id):
|
|
try:
|
|
return cls.get_guild_roles(guild_id).filter(role_type__gte=90)
|
|
except ObjectDoesNotExist:
|
|
return None
|
|
|
|
def __str__(self):
|
|
return f"{self.guild.id} | {self.id}"
|