From 715cd274c38cce80c664e30185a9439785dc4349 Mon Sep 17 00:00:00 2001 From: Egor Matveev Date: Wed, 2 Feb 2022 00:15:14 +0300 Subject: [PATCH] groups --- Main/models/userinfo.py | 4 ++ Main/views/GroupView.py | 47 ++++++++++++++++++ Main/views/MainView.py | 5 +- Main/views/SolutionsTableView.py | 10 +--- Main/views/SolutionsView.py | 10 ++-- Main/views/__init__.py | 1 + templates/group.html | 85 ++++++++++++++++++++++++++++++++ templates/main.html | 3 ++ templates/sets.html | 2 +- templates/solutions.html | 4 +- 10 files changed, 152 insertions(+), 19 deletions(-) create mode 100644 Main/views/GroupView.py create mode 100644 templates/group.html diff --git a/Main/models/userinfo.py b/Main/models/userinfo.py index 501c4c3..5762fdc 100644 --- a/Main/models/userinfo.py +++ b/Main/models/userinfo.py @@ -37,6 +37,10 @@ class UserInfo(models.Model): def has_favourite_language(self): return self.favourite_language_id is not None + @property + def verified_friends(self): + return User.objects.filter(Q(to_friendship__from_user=self.user) | Q(from_friendship__to_user=self.user)) + @cached_property def friends(self): return Friendship.objects.filter(Q(to_user=self.user) | Q(from_user=self.user)).order_by("verified") diff --git a/Main/views/GroupView.py b/Main/views/GroupView.py new file mode 100644 index 0000000..d0e8324 --- /dev/null +++ b/Main/views/GroupView.py @@ -0,0 +1,47 @@ +from django.contrib.auth.models import User + +from SprintLib.BaseView import BaseView, AccessError + + +class GroupView(BaseView): + required_login = True + endpoint = 'group' + view_file = 'group.html' + owner = False + + def pre_handle(self): + self.owner = self.entities.group.creator == self.request.user or self.request.user.username in self.entities.group.editors + + def get(self): + if self.owner: + self.context['possible_users'] = set(self.entities.group.users.all()) | set(self.request.user.userinfo.verified_friends) + + def post_sets_edit(self): + if not self.owner: + raise AccessError() + current_sets = self.entities.group.sets.all() + set_ids = [set.id for set in current_sets] + for key, value in self.request.POST.items(): + if key.startswith("set_"): + i = int(key.split("_")[1]) + if i not in set_ids: + self.entities.group.sets.add(i) + to_delete = [i for i in set_ids if "set_" + str(i) not in self.request.POST] + for t in to_delete: + self.entities.group.sets.remove(t) + return "/group?group_id=" + str(self.entities.group.id) + + def post_users_edit(self): + if not self.owner: + raise AccessError() + current_users = self.entities.group.users.all() + users_ids = [user.id for user in current_users] + for key, value in self.request.POST.items(): + if key.startswith("user_"): + i = int(key.split("_")[1]) + if i not in users_ids: + self.entities.group.users.add(i) + to_delete = [i for i in users_ids if "user_" + str(i) not in self.request.POST] + for t in to_delete: + self.entities.group.users.remove(t) + return "/group?group_id=" + str(self.entities.group.id) diff --git a/Main/views/MainView.py b/Main/views/MainView.py index 7b9b49c..f3aacb6 100644 --- a/Main/views/MainView.py +++ b/Main/views/MainView.py @@ -1,9 +1,9 @@ from random import sample -from django.db.models import Count, Max +from django.db.models import Count, Max, Q from django.utils import timezone -from Main.models import Task, UserInfo, Solution +from Main.models import Task, UserInfo, Solution, Group from SprintLib.BaseView import BaseView @@ -29,3 +29,4 @@ class MainView(BaseView): setattr(task, 'solution', Solution.objects.filter(user=self.request.user, task=task).first()) new_tasks = set(Task.objects.filter(public=True)) - set(all_tasks) self.context['new_tasks'] = sample(new_tasks, k=min(5, len(new_tasks))) + self.context['groups'] = Group.objects.filter(Q(editors__in=self.request.user.username) | Q(creator=self.request.user) | Q(users=self.request.user)).distinct() diff --git a/Main/views/SolutionsTableView.py b/Main/views/SolutionsTableView.py index 76d1b42..a6425e7 100644 --- a/Main/views/SolutionsTableView.py +++ b/Main/views/SolutionsTableView.py @@ -14,17 +14,11 @@ class SolutionsTableView(BaseView): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.filters = [ - self.filter_user, - self.filter_task, self.filter_set, + self.filter_task, ] self.queryset = Solution.objects.all() - def filter_user(self, queryset: QuerySet): - if 'username' in self.request.GET: - return queryset.filter(user__username=self.request.GET["username"]) - return queryset - def filter_task(self, queryset: QuerySet): if 'task_id' in self.request.GET: return queryset.filter(task_id=int(self.request.GET['task_id'])) @@ -32,7 +26,7 @@ class SolutionsTableView(BaseView): def filter_set(self, queryset: QuerySet): if 'set_id' in self.request.GET: - return queryset.filter() + return queryset.filter(task__settasks__set_id=self.request.GET['set_id']).distinct() return queryset def pre_handle(self): diff --git a/Main/views/SolutionsView.py b/Main/views/SolutionsView.py index bdcd86b..4b3de79 100644 --- a/Main/views/SolutionsView.py +++ b/Main/views/SolutionsView.py @@ -7,10 +7,6 @@ class SolutionsView(BaseView): view_file = "solutions.html" def get(self): - self.context["username"] = self.request.GET.get("username") - self.context["task_id"] = self.request.GET.get("task_id") - if self.context["task_id"]: - self.context["task_id"] = int(self.context["task_id"]) - self.context["set_id"] = self.request.GET.get("set_id") - if self.context["set_id"]: - self.context["set_id"] = int(self.context["set_id"]) + self.context['task_id'] = self.request.GET.get('task_id') + if not self.context['task_id']: + self.context['set_id'] = self.request.GET['set_id'] diff --git a/Main/views/__init__.py b/Main/views/__init__.py index 62656aa..0efb8cc 100644 --- a/Main/views/__init__.py +++ b/Main/views/__init__.py @@ -19,3 +19,4 @@ from Main.views.ChatView import ChatView from Main.views.ChatWithView import ChatWithView from Main.views.MessagesView import MessagesView from Main.views.SetView import SetView +from Main.views.GroupView import GroupView diff --git a/templates/group.html b/templates/group.html new file mode 100644 index 0000000..deb35ce --- /dev/null +++ b/templates/group.html @@ -0,0 +1,85 @@ +{% extends 'base_main.html' %} + +{% block main %} +

{{ group.name }}

+ {% if group.creator %}Владелец группы: {{ group.creator.username }} {% endif %} +

+

Сеты

+ {% for set in group.sets.all %} + {{ set.name }}
+ {% endfor %} + {% if group.creator == user or user.username in user.editors %} + + + {% endif %} +

+

Пользователи

+ {% for u in group.users.all %} + {{ u.username }}

+ {% endfor %} + {% if group.creator == user or user.username in user.editors %} + + + {% endif %} +

+{% endblock %} \ No newline at end of file diff --git a/templates/main.html b/templates/main.html index 9e74ed5..cf5e281 100644 --- a/templates/main.html +++ b/templates/main.html @@ -4,6 +4,9 @@ {% block main %}

Мои группы

+ {% for group in groups %} + {{ group.name }} + {% endfor %}

Топ задач сегодня

{% for task in top_tasks_today %} diff --git a/templates/sets.html b/templates/sets.html index 9952eb6..42cdb65 100644 --- a/templates/sets.html +++ b/templates/sets.html @@ -44,6 +44,6 @@ {% for set in user.userinfo.available_sets %} - {{ set.name }} {% if set.creator == user %} {% endif %}
+ {{ set.name }} {% if set.creator == user %} {% endif %}
{% endfor %} {% endblock %} diff --git a/templates/solutions.html b/templates/solutions.html index 4e8c86e..e9108ca 100644 --- a/templates/solutions.html +++ b/templates/solutions.html @@ -6,7 +6,7 @@ page = number; } function doPoll() { - jQuery.get('/solutions_table?task_id={{ task.id }}&page=' + page.toString(), function(data) { + jQuery.get('/solutions_table?{% if task_id %}task_id={{ task.id }}{% else %}set_id={{ set.id }}{% endif %}&page=' + page.toString(), function(data) { var e = document.getElementById('solutions'); if (e.innerHTML !== data) e.innerHTML = data; @@ -24,6 +24,7 @@ {% block main %}

Решения

+
{% endblock %} \ No newline at end of file