diff --git a/.gitignore b/.gitignore index 0e1ea32..208433f 100644 --- a/.gitignore +++ b/.gitignore @@ -166,3 +166,6 @@ staticfiles/ # database db.sqlite3 + +# todo +todo* diff --git a/api/actions.py b/api/actions.py new file mode 100644 index 0000000..41a5c44 --- /dev/null +++ b/api/actions.py @@ -0,0 +1,15 @@ +from .views import * +from users.models import * + +def is_action_processable(request): + user = Users.objects.get(request.body["user"]) + if user: + # TODO implement + return True + + +def process_action(request): + if not is_action_processable(request): + return + print(request.body) + diff --git a/api/data.py b/api/data.py new file mode 100644 index 0000000..45a480f --- /dev/null +++ b/api/data.py @@ -0,0 +1,19 @@ +# Defines Data ffs + + +VIEW_ACTION = 0 +PURCHASE_ACTION = 1 +MODIFY_ACTION = 2 +EQUIP_ACTION = 3 + +# Need to define costs for purchase actions and requirements for modify and equip actions + +# Saving space and reducing response times of the server is a priority so keeping in mind that this +# data will probably live on the RAM (as file-io is costly) so it needs to be small and easy to parse + +# # sights,trg,brl +# # cost,ammo^inter^ >^skin,number +# # |----|^^|-||-|>^>^|--||------| +# WEAPON_DATA = """000000000000000000000000000000""" # Use Ints goddamit +# oh yeah, ints +WEAPON_DATA = [] # wtf diff --git a/api/tests.py b/api/tests.py index 7ce503c..942132f 100644 --- a/api/tests.py +++ b/api/tests.py @@ -1,3 +1,72 @@ from django.test import TestCase +from django.contrib.auth.models import User +from rest_framework.test import APITestCase, APIClient +from rest_framework import status # Create your tests here. +class UnAuthAccessTests(APITestCase): + def test_province_get(self): + response = self.client.get("/api/v1/provinces/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_assault_troops_get(self): + response = self.client.get("/api/v1/assault_troops/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_servers_get(self): + response = self.client.get("/api/v1/servers/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_players_get(self): + response = self.client.get("/api/v1/players/") + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + def test_user_action_get(self): + response = self.client.get("/api/v1/user_action/") + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + def test_user_action_post(self): + response = self.client.post("/api/v1/user_action/", {"user": 1, "action": "142"}, format="json") + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + +class AuthAccessTests(APITestCase): + def setUp(self): + self.user = User.objects.create_user(username="test", password="pass123") + self.user2 = User.objects.create_user(username="test2", password="pass123", is_staff=True) + + def test_province_get(self): + self.client.login(username="test", password="pass123") + response = self.client.get("/api/v1/provinces/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_assault_troops_get(self): + self.client.login(username="test", password="pass123") + response = self.client.get("/api/v1/assault_troops/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_servers_get(self): + self.client.login(username="test", password="pass123") + response = self.client.get("/api/v1/servers/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_players_get(self): + self.client.login(username="test", password="pass123") + response = self.client.get("/api/v1/players/") + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + def test_players_staff_get(self): + self.client.login(username="test2", password="pass123") + response = self.client.get("/api/v1/players/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_user_action_post(self): + self.client.login(username="test", password="pass123") + response = self.client.post("/api/v1/user_action/", {"user": 1, "action": "142"}, format="json") + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + + def test_user_data_get(self): + self.client.login(username="test", password="pass123") + response = self.client.get("/api/v1/user_data/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + diff --git a/api/urls.py b/api/urls.py index 8a07d97..8b5c32b 100644 --- a/api/urls.py +++ b/api/urls.py @@ -12,4 +12,5 @@ urlpatterns = [ path('servers//', ServerView.as_view()), path('user_data/', UserDataView.as_view()), path('user_data//', UserDatumView.as_view()), + path('user_action/', UserActionView.as_view()), ] diff --git a/api/views.py b/api/views.py index a4adcd0..cba676b 100644 --- a/api/views.py +++ b/api/views.py @@ -1,8 +1,9 @@ -from rest_framework import generics, permissions +from rest_framework import generics, permissions, mixins from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator from .models import * from .filters import * +from .actions import * from .serializers import * from .permissions import * from users.models import * @@ -42,7 +43,7 @@ class PlayersView(generics.ListCreateAPIView): @method_decorator(csrf_exempt, name='dispatch') class PlayerView(generics.RetrieveUpdateDestroyAPIView): - permission_classes = (IsStaff) + permission_classes = (IsStaff,) queryset = Player.objects.all() serializer_class = PlayerSerializer @@ -72,4 +73,15 @@ class UserDataView(generics.ListCreateAPIView): permission_classes = (IsSuperUserOrAuthReadOnly,) queryset = UserData.objects.all() serializer_class = UserDataSerializer - filter_backends = [UserDataFilterBackend] \ No newline at end of file + filter_backends = [UserDataFilterBackend] + + +@method_decorator(csrf_exempt, name='dispatch') +class UserActionView(mixins.CreateModelMixin, generics.GenericAPIView): + permission_classes = (permissions.IsAuthenticated,) + queryset = UserAction.objects.all() + serializer_class = UserActionSerializer + + def post(self, request, *args, **kwargs): + process_action(request) + return self.create(request, *args, **kwargs) \ No newline at end of file diff --git a/blog/forms.py b/blog/forms.py new file mode 100644 index 0000000..cc1ce0a --- /dev/null +++ b/blog/forms.py @@ -0,0 +1,9 @@ +from django import forms +from .models import Post + + +class PostForm(forms.ModelForm): + class Meta: + model = Post + fields = ['content'] + diff --git a/blog/models.py b/blog/models.py index 5ada5ee..611be03 100644 --- a/blog/models.py +++ b/blog/models.py @@ -1,6 +1,6 @@ from django.contrib.auth.models import User from django.db import models -from django.utils import timezone +# from django.utils import timezone # Create your models here. @@ -8,7 +8,8 @@ class Blog(models.Model): content = models.TextField() title = models.CharField(max_length=150) author = models.ForeignKey(User, on_delete=models.CASCADE) - date_posted = models.DateTimeField(default=timezone.now) + # date_posted = models.DateTimeField(default=timezone.now) + date_posted = models.DateTimeField(auto_now_add=True) def get_absolute_url(self): return '/' @@ -18,4 +19,4 @@ class Blog(models.Model): class Post(models.Model): content = models.TextField() author = models.ForeignKey(User, on_delete=models.CASCADE) - date_posted = models.DateTimeField(default=timezone.now) + date_posted = models.DateTimeField(auto_now_add=True) diff --git a/blog/urls.py b/blog/urls.py index 3bde192..3b0c0e5 100644 --- a/blog/urls.py +++ b/blog/urls.py @@ -4,10 +4,12 @@ from . import views urlpatterns = [ path('', views.home, name='Home'), path('news/', views.news, name='News'), - path('blog/', views.BlogDetailView.as_view(), name='Blog'), - path('blog/create/', views.BlogCreateView.as_view(), name='Blog Create'), - path('post/', views.PostDetailView.as_view(), name='Post'), - path('post/create/', views.PostCreateView.as_view(), name='Post Create'), - path('dev/', views.dev, name='Dev'), + # path('blog/', views.BlogDetailView.as_view(), name='Blog'), + # path('blog/create/', views.BlogCreateView.as_view(), name='Blog Create'), + # path('post/', views.PostDetailView.as_view(), name='Post'), + # path('post/create/', views.PostCreateView.as_view(), name='Post Create'), + # path('dev/', views.dev, name='Dev'), + path('chat/', views.chat, name='Chat'), + path("chat/p/", views.posts_partial, name="ChatPartial"), path('dev/support/', views.support, name='Support'), ] diff --git a/blog/views.py b/blog/views.py index 4f7138e..5adb5d3 100644 --- a/blog/views.py +++ b/blog/views.py @@ -2,7 +2,10 @@ from django.shortcuts import render from django.contrib.auth.mixins import * from django.views.generic import * from .models import * +from .forms import * +MAX_POSTS = 150 +MARGIN = 20 # Create your views here. def news(request): @@ -49,7 +52,7 @@ class BlogCreateView(LoginRequiredMixin, CreateView): def form_valid(self, form): form.instance.author = self.request.user - return super().form_valid(form) + return super().form_valid(form) and self.request.user.is_staff @@ -68,6 +71,39 @@ class PostCreateView(LoginRequiredMixin, CreateView): return super().form_valid(form) +def chat(request): + if request.method == "POST": + form = PostForm(request.POST) + + if form.is_valid(): + post = form.save(commit=False) + post.author = request.user + post.save() + print(Post.objects.count()) + if Post.objects.count() > MAX_POSTS + MARGIN: + qs = Post.objects.order_by("-date_posted") + old_ids = qs.values_list("id", flat=True)[MAX_POSTS:] + + if old_ids: + Post.objects.filter(id__in=old_ids).delete() + + return render(request, "blog/partials/post.html", {"post": post}) + + posts = Post.objects.select_related("author").order_by("-date_posted") + form = PostForm() + + return render(request, "blog/postList.html", { + "posts": posts, + "form": form + }) + +def posts_partial(request): + posts = Post.objects.select_related("author").order_by("-date_posted")[:40] + + return render(request, "blog/partials/postList.html", { + "posts": posts + }) + def dev(request): return render(request, 'dev.html', {'title': 'Development'}) @@ -75,4 +111,4 @@ def support(request): return render(request, 'support.html', {'title': 'Support Us'}) def home(request): - return render(request, 'index.html', {'title': 'Home'}) \ No newline at end of file + return render(request, 'index.html', {'title': 'Home'}) diff --git a/db.sqlite3 b/db.sqlite3 index 51fa769..423a938 100644 Binary files a/db.sqlite3 and b/db.sqlite3 differ diff --git a/templates/base.html b/templates/base.html index b67ce7c..495cfd1 100644 --- a/templates/base.html +++ b/templates/base.html @@ -512,10 +512,11 @@