Updates to stuff lol

This commit is contained in:
Dustin Pianalto
2019-09-25 21:39:04 -08:00
parent b3eefa1266
commit 27231fda7b
39 changed files with 1974 additions and 154 deletions
+9
View File
@@ -0,0 +1,9 @@
from django.urls import path
from .views import ChannelsAPI, ChannelDetail
app_name = "channels_api"
urlpatterns = [
path("", view=ChannelsAPI.as_view(), name="list"),
path("<str:id>/", view=ChannelDetail.as_view(), name='detail')
]
+3 -1
View File
@@ -1,5 +1,7 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class ChannelsConfig(AppConfig):
name = 'channels'
name = 'geeksbot_v2.channels'
verbose_name = _("Channels")
@@ -0,0 +1,23 @@
# Generated by Django 2.2.4 on 2019-09-20 21:39
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
('guilds', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Channel',
fields=[
('id', models.CharField(max_length=30, primary_key=True, serialize=False)),
('guild', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='guilds.Guild')),
],
),
]
@@ -0,0 +1,28 @@
# Generated by Django 2.2.4 on 2019-09-21 02:50
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('channels', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='channel',
name='admin',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='channel',
name='default',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='channel',
name='new_patron',
field=models.BooleanField(default=False),
),
]
+32 -2
View File
@@ -12,6 +12,28 @@ from .utils import create_success_response
class Channel(models.Model):
id = models.CharField(max_length=30, primary_key=True)
guild = models.ForeignKey(Guild, on_delete=models.CASCADE)
default = models.BooleanField(default=False)
new_patron = models.BooleanField(default=False)
admin = models.BooleanField(default=False)
def update_channel(self, data):
if data.get('default'):
try:
existing_default = self.get_guild_channels(self.guild).get(default=True)
except ObjectDoesNotExist:
pass
else:
existing_default.default = False
existing_default.save()
finally:
self.default = data.get('default')
if data.get('new_patron'):
self.new_patron = data.get('new_patron')
if data.get('admin'):
self.admin = data.get('admin')
self.save()
return self
@classmethod
def add_new_channel(cls, data):
@@ -21,7 +43,7 @@ class Channel(models.Model):
status=status.HTTP_409_CONFLICT)
guild_id = data.get('guild')
if not (id and guild_id):
return create_error_response('Id and Guild are required',
return create_error_response('ID and Guild are required',
status=status.HTTP_400_BAD_REQUEST)
guild = Guild.get_guild_by_id(guild_id)
if not isinstance(guild, Guild):
@@ -30,7 +52,10 @@ class Channel(models.Model):
channel = cls(
id=id,
guild=guild
guild=guild,
default=data.get('default', False),
new_patron=data.get('new_patron', False),
admin=data.get('admin', False)
)
channel.save()
return create_success_response(channel, status.HTTP_201_CREATED, many=False)
@@ -41,6 +66,11 @@ class Channel(models.Model):
return cls.objects.get(id=id)
except ObjectDoesNotExist:
return None
@classmethod
def get_guild_channels(cls, guild):
if isinstance(guild, Guild):
return cls.objects.filter(guild=guild)
def __str__(self):
return str(id)
+67 -1
View File
@@ -1,3 +1,69 @@
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from django.core.exceptions import ObjectDoesNotExist
from geeksbot_v2.utils.api_utils import PaginatedAPIView
from .models import Channel
from .utils import create_error_response
from .utils import create_success_response
# Create your views here.
# API Views
class ChannelsAPI(PaginatedAPIView):
permission_classes = [IsAuthenticated]
def get(self, request, format=None):
guilds = Channel.objects.all()
page = self.paginate_queryset(guilds)
if page is not None:
return create_success_response(page, status.HTTP_200_OK, many=True)
return create_success_response(guilds, status.HTTP_200_OK, many=True)
def post(self, request, format=None):
data = dict(request.data)
return Channel.add_new_channel(data)
class ChannelDetail(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, id, format=None):
try:
guild = Channel.objects.get(id=id)
except ObjectDoesNotExist:
return create_error_response("Channel Does not Exist",
status=status.HTTP_404_NOT_FOUND)
else:
return create_success_response(guild,
status=status.HTTP_200_OK)
def put(self, request, id, format=None):
channel = Channel.get_channel_by_id(id)
if channel:
data = dict(request.data)
channel = channel.update_channel(data)
return create_success_response(channel,
status=status.HTTP_202_ACCEPTED)
else:
return create_error_response('Channel Does Not Exist',
status=status.HTTP_404_NOT_FOUND)
def delete(self, request, id, format=None):
guild = Channel.get_guild_by_id(id)
if guild:
# data = dict(request.data)
# TODO Add a check to verify user is allowed to delete...
# Possibly in object permissions...
guild.delete()
return create_success_response(guild,
status=status.HTTP_200_OK)
else:
return create_error_response('Channel Does Not Exist',
status=status.HTTP_404_NOT_FOUND)
+3
View File
@@ -80,6 +80,7 @@ LOCAL_APPS = [
"geeksbot_v2.dmessages.apps.MessagesConfig",
"geeksbot_v2.patreon.apps.PatreonConfig",
"geeksbot_v2.rcon.apps.RconConfig",
"geeksbot_v2.channels.apps.ChannelsConfig",
# Your stuff: custom apps go here
]
# https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
@@ -285,3 +286,5 @@ REST_FRAMEWORK = {
"DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.LimitOffsetPagination",
"PAGE_SIZE": 100,
}
SILENCED_SYSTEM_CHECKS = ["auth.W004"]
+4 -2
View File
@@ -16,8 +16,10 @@ urlpatterns = [
path("users/", include("geeksbot_v2.users.urls", namespace="users")),
path("accounts/", include("allauth.urls")),
# Your stuff: custom urls includes go here
path("api/users", include("geeksbot_v2.users.api_urls", namespace="users_api")),
path("api/guilds", include("geeksbot_v2.guilds.api_urls", namespace="guilds_api"))
path("api/users/", include("geeksbot_v2.users.api_urls", namespace="users_api")),
path("api/guilds/", include("geeksbot_v2.guilds.api_urls", namespace="guilds_api")),
path("api/channels/", include("geeksbot_v2.channels.api_urls", namespace="channels_api")),
path("api/messages/", include("geeksbot_v2.dmessages.api_urls", namespace="messages_api")),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
if settings.DEBUG:
+15
View File
@@ -0,0 +1,15 @@
from django.urls import path
from .views import MessageDetailAPI, MessagesAPI
from .views import RequestDetailAPI, RequestsAPI
from .views import CommentDetailAPI, CommentsAPI
app_name = "channels_api"
urlpatterns = [
path("", view=MessagesAPI.as_view(), name="message_list"),
path("<str:id>/", view=MessageDetailAPI.as_view(), name='message_detail'),
path("requests/", view=RequestsAPI.as_view(), name="requests_list"),
path("requests/<str:id>/", view=RequestDetailAPI.as_view(), name='request_detail'),
path("requests/<str:request_id>/comments/", view=CommentsAPI.as_view(), name="comments_list"),
path("requests/<str:request_id>/comments/<str:comment_id>/", view=CommentDetailAPI.as_view(), name='comment_detail'),
]
@@ -1,9 +1,7 @@
# Generated by Django 2.2.4 on 2019-09-17 19:31
# Generated by Django 2.2.4 on 2019-09-20 21:39
from django.conf import settings
import django.contrib.postgres.fields
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
@@ -11,29 +9,26 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
('guilds', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Message',
name='AdminComment',
fields=[
('id', models.CharField(max_length=30, primary_key=True, serialize=False)),
('channel', models.CharField(max_length=30)),
('created_at', models.DateTimeField()),
('modified_at', models.DateTimeField(null=True)),
('deleted_at', models.DateTimeField(null=True)),
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('content', models.CharField(max_length=1000)),
('updated_at', models.DateTimeField(auto_now_add=True)),
],
),
migrations.CreateModel(
name='AdminRequest',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('completed', models.BooleanField(default=False)),
('requested_at', models.DateTimeField(auto_now_add=True)),
('completed_at', models.DateTimeField(blank=True, default=None, null=True)),
('completed_message', models.CharField(blank=True, default=None, max_length=1000, null=True)),
('content', models.CharField(max_length=2000)),
('previous_content', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=2000), size=None)),
('tagged_users', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=30), size=None)),
('tagged_channels', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=30), size=None)),
('tagged_roles', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=30), size=None)),
('tagged_everyone', models.BooleanField()),
('embeds', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), size=None)),
('previous_embeds', django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), size=None), size=None)),
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
('guild', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='guilds.Guild')),
],
),
migrations.CreateModel(
@@ -45,20 +40,20 @@ class Migration(migrations.Migration):
('format', models.PositiveSmallIntegerField()),
('channel', models.CharField(max_length=30)),
('message_number', models.PositiveSmallIntegerField()),
('guild', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='guilds.Guild')),
('message', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dmessages.Message')),
],
),
migrations.CreateModel(
name='AdminRequest',
name='Message',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('completed', models.BooleanField()),
('requested_at', models.DateTimeField()),
('completed_at', models.DateTimeField()),
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
('guild', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='guilds.Guild')),
('message', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dmessages.Message')),
('id', models.CharField(max_length=30, primary_key=True, serialize=False)),
('created_at', models.DateTimeField()),
('modified_at', models.DateTimeField(blank=True, null=True)),
('deleted_at', models.DateTimeField(blank=True, null=True)),
('content', models.CharField(max_length=2000)),
('previous_content', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=2000), default=list, size=None)),
('tagged_everyone', models.BooleanField()),
('embeds', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), default=list, size=None)),
('previous_embeds', django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), size=None), default=list, size=None)),
],
),
]
@@ -0,0 +1,95 @@
# Generated by Django 2.2.4 on 2019-09-20 21:39
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('guilds', '0001_initial'),
('dmessages', '0001_initial'),
('channels', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='message',
name='author',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='message',
name='channel',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='channels.Channel'),
),
migrations.AddField(
model_name='message',
name='guild',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='guilds.Guild'),
),
migrations.AddField(
model_name='message',
name='tagged_channels',
field=models.ManyToManyField(related_name='_message_tagged_channels_+', to='channels.Channel'),
),
migrations.AddField(
model_name='message',
name='tagged_roles',
field=models.ManyToManyField(to='guilds.Role'),
),
migrations.AddField(
model_name='message',
name='tagged_users',
field=models.ManyToManyField(related_name='_message_tagged_users_+', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='guildinfo',
name='guild',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='guilds.Guild'),
),
migrations.AddField(
model_name='guildinfo',
name='message',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dmessages.Message'),
),
migrations.AddField(
model_name='adminrequest',
name='author',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='adminrequest',
name='channel',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='channels.Channel'),
),
migrations.AddField(
model_name='adminrequest',
name='completed_by',
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='adminrequest',
name='guild',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='guilds.Guild'),
),
migrations.AddField(
model_name='adminrequest',
name='message',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='dmessages.Message'),
),
migrations.AddField(
model_name='admincomment',
name='author',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='admincomment',
name='request',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dmessages.AdminRequest'),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 2.2.4 on 2019-09-21 07:21
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('dmessages', '0002_auto_20190920_2139'),
]
operations = [
migrations.AlterField(
model_name='message',
name='content',
field=models.CharField(blank=True, max_length=2000, null=True),
),
]
+27 -18
View File
@@ -19,20 +19,20 @@ from .utils import create_comment_success_response
class Message(models.Model):
id = models.CharField(max_length=30, primary_key=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
author = models.ForeignKey(User, related_name="+", on_delete=models.CASCADE)
guild = models.ForeignKey(Guild, on_delete=models.CASCADE)
channel = models.ForeignKey(Channel, on_delete=models.CASCADE)
channel = models.ForeignKey(Channel, related_name="+", on_delete=models.CASCADE)
created_at = models.DateTimeField()
modified_at = models.DateTimeField(null=True, blank=True)
deleted_at = models.DateTimeField(null=True, blank=True)
content = models.CharField(max_length=2000)
previous_content = ArrayField(models.CharField(max_length=2000), default=[])
tagged_users = models.ManyToManyField(User)
tagged_channels = models.ManyToManyField(Channel)
content = models.CharField(max_length=2000, null=True, blank=True)
previous_content = ArrayField(models.CharField(max_length=2000), default=list)
tagged_users = models.ManyToManyField(User, related_name="+")
tagged_channels = models.ManyToManyField(Channel, related_name="+")
tagged_roles = models.ManyToManyField(Role)
tagged_everyone = models.BooleanField()
embeds = ArrayField(models.TextField(), default=[])
previous_embeds = ArrayField(ArrayField(models.TextField()), default=[])
embeds = ArrayField(models.TextField(), default=list)
previous_embeds = ArrayField(ArrayField(models.TextField()), default=list)
@classmethod
def add_new_message(cls, data):
@@ -46,7 +46,7 @@ class Message(models.Model):
created_at = data.get('created_at')
content = data.get('content')
tagged_everyone = data.get('tagged_everyone')
if not (id and author_id and guild_id and channel_id and created_at and content and tagged_everyone):
if not (id and author_id and guild_id and channel_id and created_at and (tagged_everyone is not None)):
return create_error_response("One or more required fields are missing.",
status=status.HTTP_400_BAD_REQUEST)
author = User.get_user_by_id(author_id)
@@ -97,9 +97,9 @@ class Message(models.Model):
def update_message(self, data):
if data.get('modified_at'):
self.modified_at = data.get('modified_at')
self.modified_at = datetime.fromtimestamp(int(data.get('modified_at')))
if data.get('deleted_at'):
self.modified_at = data.get('deleted_at')
self.deleted_at = datetime.fromtimestamp(int(data.get('deleted_at')))
if data.get('content'):
content = data.get('content')
if content != self.content:
@@ -164,13 +164,15 @@ class GuildInfo(models.Model):
class AdminRequest(models.Model):
guild = models.ForeignKey(Guild, on_delete=models.CASCADE)
author = models.ForeignKey(User, on_delete=models.DO_NOTHING)
author = models.ForeignKey(User, related_name="+", on_delete=models.DO_NOTHING)
message = models.ForeignKey(Message, on_delete=models.DO_NOTHING)
channel = models.ForeignKey(Channel, on_delete=models.DO_NOTHING)
channel = models.ForeignKey(Channel, on_delete=models.DO_NOTHING, null=True)
completed = models.BooleanField(default=False)
requested_at = models.DateTimeField(auto_now_add=True, blank=True)
completed_at = models.DateTimeField(null=True, blank=True, default=None)
completed_by = models.ForeignKey(User, on_delete=models.DO_NOTHING, null=True, blank=True, default=None)
completed_by = models.ForeignKey(
User, related_name="+", on_delete=models.DO_NOTHING, null=True, blank=True, default=None
)
completed_message = models.CharField(max_length=1000, null=True, blank=True, default=None)
content = models.CharField(max_length=2000)
@@ -179,7 +181,7 @@ class AdminRequest(models.Model):
completed_by_id = data.get('completed_by')
completed_message = data.get('message')
if not self.completed and completed:
self.completed_at = datetime.now()
self.completed_at = datetime.utcnow()
self.completed_message = completed_message
user = User.get_user_by_id(completed_by_id)
if not isinstance(user, User):
@@ -226,6 +228,10 @@ class AdminRequest(models.Model):
request.save()
return create_request_success_response(request, status.HTTP_201_CREATED, many=False)
@classmethod
def get_open_requests_by_guild(cls, guild_id):
return cls.objects.filter(guild__id=guild_id).filter(completed=False)
@classmethod
def get_request_by_id(cls, id):
try:
@@ -244,8 +250,7 @@ class AdminComment(models.Model):
updated_at = models.DateTimeField(auto_now_add=True, blank=True)
@classmethod
def add_new_comment(cls, data):
request_id = data.get('request')
def add_new_comment(cls, data, request_id):
author_id = data.get('author')
content = data.get('content')
if not (request_id and author_id and content):
@@ -259,7 +264,7 @@ class AdminComment(models.Model):
if not isinstance(author, User):
return create_error_response("Author Does Not Exist",
status=status.HTTP_404_NOT_FOUND)
comment = cls(
request=request,
author=author,
@@ -274,3 +279,7 @@ class AdminComment(models.Model):
return cls.objects.get(id=id)
except ObjectDoesNotExist:
return None
@classmethod
def get_comments_by_request(cls, request):
return cls.objects.filter(request=request)
+122 -1
View File
@@ -1,3 +1,124 @@
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from django.core.exceptions import ObjectDoesNotExist
from rest_framework.response import Response
from rest_framework import status
from .models import Message
from .models import AdminComment
from .models import AdminRequest
from .models import GuildInfo
from geeksbot_v2.utils.api_utils import PaginatedAPIView
from .utils import create_error_response
from .utils import create_success_response
from .utils import create_request_success_response
from .utils import create_comment_success_response
from .serializers import AdminRequestSerializer
from .serializers import AdminCommentSerializer
# Create your views here.
# API Views
class MessagesAPI(PaginatedAPIView):
permission_classes = [IsAuthenticated]
def get(self, request, format=None):
messages = Message.objects.all()
page = self.paginate_queryset(messages)
if page:
return create_success_response(page, status.HTTP_200_OK, many=True)
return create_success_response(messages, status.HTTP_200_OK, many=True)
def post(self, request, format=None):
data = dict(request.data)
return Message.add_new_message(data)
class MessageDetailAPI(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, id, format=None):
message = Message.get_message_by_id(id)
if message:
return create_success_response(message, status.HTTP_200_OK, many=False)
else:
return create_error_response("Message Does Not Exist",
status=status.HTTP_404_NOT_FOUND)
def put(self, request, id, format=None):
data = dict(request.data)
message = Message.get_message_by_id(id)
if message:
return message.update_message(data)
else:
return create_error_response('Message Does Not Exist',
status=status.HTTP_404_NOT_FOUND)
class RequestsAPI(PaginatedAPIView):
permission_classes = [IsAuthenticated]
def get(self, request, guild, format=None):
requests = AdminRequest.get_open_requests_by_guild(guild)
page = self.paginate_queryset(requests)
if page is not None:
return create_request_success_response(page, status.HTTP_200_OK, many=True)
return create_request_success_response(requests, status.HTTP_200_OK, many=True)
def post(self, request, format=None):
data = dict(request.data)
return AdminRequest.add_new_request(data)
class RequestDetailAPI(APIView):
permission_classes = [IsAuthenticated]
def get(self, req, id, format=None):
req = AdminRequest.get_request_by_id(id)
if req:
comments = AdminComment.get_comments_by_request(req)
if comments:
data = AdminRequestSerializer(req).data
data['comments'] = AdminCommentSerializer(comments, many=True).data
return Response(data, status.HTTP_200_OK)
else:
return create_request_success_response(req, status.HTTP_200_OK, many=False)
else:
return create_error_response("That Request Does Not Exist",
status=status.HTTP_404_NOT_FOUND)
def put(self, request, id, format=None):
req = AdminRequest.get_request_by_id(id)
if req:
data = dict(request.data)
return req.update_request(data)
return create_error_response("That Request Does Not Exist",
status=status.HTTP_404_NOT_FOUND)
class CommentsAPI(PaginatedAPIView):
permissions_classes = [IsAuthenticated]
def post(self, request, request_id, format=None):
data = dict(request.data)
return AdminComment.add_new_comment(data, request_id)
class CommentDetailAPI(APIView):
permissions_classes = [IsAuthenticated]
def get(self, request, request_id, comment_id, format=None):
comment = AdminComment.get_comment_by_id(comment_id)
if comment:
if comment.request.id != request_id:
return create_error_response("That comment is not for this request",
status=status.HTTP_400_BAD_REQUEST)
return create_comment_success_response(comment, status.HTTP_200_OK, many=False)
else:
return create_error_response("Comment Does Not Exist",
status=status.HTTP_404_NOT_FOUND)
+1 -1
View File
@@ -36,7 +36,7 @@ done
>&2 echo 'PostgreSQL is available'
python manage.py collectstatic --noinput
python manage.py makemigrations
python manage.py makemigrations --noinput
python manage.py migrate
/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
+6 -3
View File
@@ -1,9 +1,12 @@
from django.urls import path
from .views import GuildsAPI, GuildDetail
from .views import RolesAPI, RoleDetailAPI
app_name = "users_api"
app_name = "guilds_api"
urlpatterns = [
path("/", view=GuildsAPI.as_view(), name="list"),
path("/<str:id>/", view=GuildDetail.as_view(), name='detail')
path("", view=GuildsAPI.as_view(), name="list"),
path("<str:id>/", view=GuildDetail.as_view(), name='detail'),
path("<str:guild_id>/roles/", view=RolesAPI.as_view(), name="list"),
path("<str:guild_id>/roles/<str:id>/", view=RoleDetailAPI.as_view(), name='detail'),
]
@@ -1,4 +1,4 @@
# Generated by Django 2.2.4 on 2019-09-17 19:31
# Generated by Django 2.2.4 on 2019-09-20 21:39
import django.contrib.postgres.fields
from django.db import migrations, models
@@ -28,7 +28,7 @@ class Migration(migrations.Migration):
name='Role',
fields=[
('id', models.CharField(max_length=30, primary_key=True, serialize=False)),
('type', models.PositiveSmallIntegerField()),
('role_type', models.PositiveSmallIntegerField()),
('guild', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='guilds.Guild')),
],
),
@@ -0,0 +1,25 @@
# Generated by Django 2.2.4 on 2019-09-21 02:50
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('guilds', '0001_initial'),
]
operations = [
migrations.RemoveField(
model_name='guild',
name='admin_chat',
),
migrations.RemoveField(
model_name='guild',
name='default_channel',
),
migrations.RemoveField(
model_name='guild',
name='new_patron_channel',
),
]
+9 -19
View File
@@ -15,24 +15,15 @@ from .utils import create_role_success_response
class Guild(models.Model):
id = models.CharField(max_length=30, primary_key=True)
admin_chat = models.CharField(max_length=30, blank=True, null=True)
new_patron_message = models.TextField(max_length=1000, blank=True, null=True)
default_channel = models.CharField(max_length=30)
new_patron_channel = models.CharField(max_length=30, 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('admin_chat'):
self.admin_chat = data.get('admin_chat')
if data.get('new_patron_message'):
self.new_patron_message = data.get('new_patron_message')
if data.get('default_channel'):
self.default_channel = data.get('default_channel')
if data.get('new_patron_channel'):
self.new_patron_channel = data.get('new_patron_channel')
if data.get('add_prefix'):
if data.get('add_prefix') not in self.prefixes:
self.prefixes.append(data.get('add_prefix'))
@@ -55,9 +46,8 @@ class Guild(models.Model):
@classmethod
def create_guild(cls, data):
id = data.get('id')
default_channel = data.get('default_channel')
if not (id and default_channel):
return create_error_response('id and default_channel are required',
if not id:
return create_error_response('ID is required',
status=status.HTTP_400_BAD_REQUEST)
if cls.get_guild_by_id(id):
@@ -66,11 +56,8 @@ class Guild(models.Model):
guild = cls(
id=id,
default_channel=default_channel,
prefixes=data.get('prefixes'),
admin_chat=data.get('admin_chat'),
new_patron_message=data.get('new_patron_message'),
new_patron_channel=data.get('new_patron_channel')
new_patron_message=data.get('new_patron_message')
)
guild.save()
return create_success_response(guild, status.HTTP_201_CREATED, many=False)
@@ -89,11 +76,10 @@ class Role(models.Model):
return create_role_success_response(self, status=status.HTTP_202_ACCEPTED, many=False)
@classmethod
def add_new_role(cls, data):
def add_new_role(cls, guild_id, data):
id = data.get('id')
guild_id = data.get('guild')
role_type = data.get('role_type')
if not (id and guild_id and role_type):
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)
@@ -132,5 +118,9 @@ class Role(models.Model):
except ObjectDoesNotExist:
return None
@classmethod
def get_guild_roles(cls, guild):
return cls.objects.filter(guild__id=guild)
def __str__(self):
return f"{self.guild.id} | {self.id}"
+1 -1
View File
@@ -13,4 +13,4 @@ class GuildSerializer(serializers.ModelSerializer):
class RoleSerializer(serializers.ModelSerializer):
class Meta:
model = Role
fields = ["id", "guild", "type"]
fields = ["id", "guild", "role_type"]
+44
View File
@@ -5,8 +5,10 @@ from django.core.exceptions import ObjectDoesNotExist
from geeksbot_v2.utils.api_utils import PaginatedAPIView
from .models import Guild
from .models import Role
from .utils import create_error_response
from .utils import create_success_response
from .utils import create_role_success_response
# Create your views here.
@@ -67,3 +69,45 @@ class GuildDetail(APIView):
else:
return create_error_response('Guild Does Not Exist',
status=status.HTTP_404_NOT_FOUND)
class RolesAPI(PaginatedAPIView):
permission_classes = [IsAuthenticated]
def get(self, request, guild_id, format=None):
roles = Role.get_guild_roles(guild_id)
page = self.paginate_queryset(roles)
if page is not None:
return create_success_response(page, status.HTTP_200_OK, many=True)
return create_success_response(roles, status.HTTP_200_OK, many=True)
def post(self, request, guild_id, format=None):
data = dict(request.data)
return Role.add_new_role(guild_id, data)
class RoleDetailAPI(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, guild_id, id, format=None):
try:
role = Role.objects.get(id=id)
except ObjectDoesNotExist:
return create_error_response("Guild Does not Exist",
status=status.HTTP_404_NOT_FOUND)
else:
return create_role_success_response(role,
status=status.HTTP_200_OK)
def put(self, request, guild_id, id, format=None):
role = Role.get_role_by_id(id)
if role:
data = dict(request.data)
role = role.update_role(data)
return create_role_success_response(role,
status=status.HTTP_202_ACCEPTED)
else:
return create_error_response('Guild Does Not Exist',
status=status.HTTP_404_NOT_FOUND)
@@ -1,4 +1,4 @@
# Generated by Django 2.2.4 on 2019-09-17 19:31
# Generated by Django 2.2.4 on 2019-09-20 21:39
from django.db import migrations, models
import django.db.models.deletion
@@ -16,10 +16,9 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='PatreonCreator',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('creator', models.CharField(max_length=50)),
('link', models.CharField(max_length=100)),
('guild', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='guilds.Guild')),
('creator', models.CharField(max_length=50, primary_key=True, serialize=False)),
('link', models.CharField(max_length=100, unique=True)),
('guilds', models.ManyToManyField(to='guilds.Guild')),
],
),
migrations.CreateModel(
@@ -30,7 +29,8 @@ class Migration(migrations.Migration):
('description', models.TextField()),
('amount', models.IntegerField(null=True)),
('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='patreon.PatreonCreator')),
('guild', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='guilds.Guild')),
('guild', models.ManyToManyField(to='guilds.Guild')),
('next_lower_tier', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='patreon.PatreonTier')),
('role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='guilds.Role')),
],
),
+4 -4
View File
@@ -70,7 +70,7 @@ class PatreonTier(models.Model):
description = models.TextField()
role = models.ForeignKey(Role, on_delete=models.CASCADE)
amount = models.IntegerField(null=True)
next_lower_tier = models.ForeignKey('self', null=True, blank=True)
next_lower_tier = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True)
def update_tier(self, data):
if data.get('guild'):
@@ -97,17 +97,17 @@ class PatreonTier(models.Model):
return create_error_response('Next Lower Tier Does Not Exist',
status=status.HTTP_404_NOT_FOUND)
self.next_lower_tier = tier
self.save()
return create_success_tier_response(tier, status.HTTP_202_ACCEPTED, many=False)
@classmethod
def get_tier_by_id(cls, id):
try:
return cls.objects.get(id=id)
except ObjectDoesNotExist:
return None
@classmethod
def add_new_tier(cls, data):
creator_str = data.get('creator')
+8 -10
View File
@@ -1,6 +1,5 @@
# Generated by Django 2.2.4 on 2019-09-17 19:31
# Generated by Django 2.2.4 on 2019-09-20 21:39
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
@@ -10,9 +9,9 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
('dmessages', '0001_initial'),
('guilds', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('dmessages', '0001_initial'),
('channels', '0001_initial'),
]
operations = [
@@ -25,13 +24,12 @@ class Migration(migrations.Migration):
('port', models.PositiveIntegerField()),
('password', models.CharField(max_length=50)),
('monitor_chat', models.BooleanField()),
('monitor_chat_channel', models.CharField(blank=True, max_length=30)),
('alerts_channel', models.CharField(blank=True, max_length=30)),
('info_channel', models.CharField(blank=True, max_length=30)),
('alerts_channel', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='channels.Channel')),
('guild', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='guilds.Guild')),
('info_message', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='dmessages.Message')),
('settings_message', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='dmessages.Message')),
('whitelist', models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL)),
('info_channel', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='channels.Channel')),
('info_message', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='dmessages.Message')),
('monitor_chat_channel', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='channels.Channel')),
('settings_message', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='dmessages.Message')),
],
),
]
@@ -0,0 +1,22 @@
# Generated by Django 2.2.4 on 2019-09-20 21:39
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('rcon', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='rconserver',
name='whitelist',
field=models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL),
),
]
+2 -2
View File
@@ -4,6 +4,6 @@ from geeksbot_v2.users.views import UsersAPI, UserDetail
app_name = "users_api"
urlpatterns = [
path("/", view=UsersAPI.as_view(), name="list"),
path("/<str:id>/", view=UserDetail.as_view(), name="detail"),
path("", view=UsersAPI.as_view(), name="list"),
path("<str:id>/", view=UserDetail.as_view(), name="detail"),
]
+6 -6
View File
@@ -1,4 +1,4 @@
# Generated by Django 2.2.4 on 2019-09-17 19:38
# Generated by Django 2.2.4 on 2019-09-20 21:39
from django.conf import settings
import django.contrib.auth.models
@@ -25,7 +25,6 @@ class Migration(migrations.Migration):
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')),
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
@@ -33,11 +32,12 @@ class Migration(migrations.Migration):
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('name', models.CharField(blank=True, max_length=255, verbose_name='Name of User')),
('username', models.CharField(help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
('id', models.CharField(max_length=30, primary_key=True, serialize=False)),
('discord_username', models.CharField(max_length=100, null=True)),
('previous_discord_usernames', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), blank=True, null=True, size=None)),
('discriminator', models.IntegerField(null=True)),
('previous_discriminators', django.contrib.postgres.fields.ArrayField(base_field=models.IntegerField(), blank=True, null=True, size=None)),
('discriminator', models.CharField(max_length=4, null=True)),
('previous_discriminators', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=4), blank=True, null=True, size=None)),
('steam_id', models.CharField(blank=True, max_length=30, null=True)),
('animated', models.BooleanField(blank=True, null=True)),
('avatar', models.CharField(blank=True, max_length=100, null=True)),
@@ -61,9 +61,9 @@ class Migration(migrations.Migration):
name='UserLog',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('time', models.DateTimeField()),
('time', models.DateTimeField(auto_now_add=True)),
('action', models.IntegerField()),
('description', models.CharField(max_length=100)),
('description', models.CharField(blank=True, max_length=100, null=True)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
@@ -1,19 +0,0 @@
# Generated by Django 2.2.4 on 2019-09-17 21:09
import django.contrib.auth.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='user',
name='username',
field=models.CharField(help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username'),
),
]
@@ -1,24 +0,0 @@
# Generated by Django 2.2.4 on 2019-09-18 05:54
import django.contrib.postgres.fields
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0002_auto_20190917_2109'),
]
operations = [
migrations.AlterField(
model_name='user',
name='discriminator',
field=models.CharField(max_length=4, null=True),
),
migrations.AlterField(
model_name='user',
name='previous_discriminators',
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=4), blank=True, null=True, size=None),
),
]