Skip to content

Commit 10ed737

Browse files
authored
Merge pull request #19 from PROCOLLAB-github/dev
Dev
2 parents c453ba1 + 92b13bc commit 10ed737

30 files changed

Lines changed: 484 additions & 71 deletions

README.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
### Clone project
66

7-
📌 `git clone https://github.com/Yakser/procollab-backend.git`
7+
📌 `git clone https://github.com/procollab-github/api.git`
88

99
### Create virtual environment
1010

@@ -31,4 +31,10 @@ To install pre-commit simply run inside the shell:
3131

3232
```bash
3333
pre-commit install
34-
```
34+
```
35+
36+
To run it on all of your files, do
37+
38+
```bash
39+
pre-commit run --all-files
40+
```

core/permissions.py

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,6 @@ def has_permission(self, request, view) -> bool:
1212
return False
1313

1414

15-
class IsProjectLeaderForVacancyResponse(BasePermission):
16-
def has_object_permission(self, request, view, obj):
17-
if obj.vacancy.project.leader == request.user:
18-
return True
19-
return False
20-
21-
22-
class IsProjectLeaderOrReadOnly(BasePermission):
23-
"""
24-
Allows access to update only to project leader.
25-
"""
26-
27-
def has_permission(self, request, view) -> bool:
28-
if request.method in SAFE_METHODS or (request.user and request.user.id):
29-
return True
30-
return False
31-
32-
def has_object_permission(self, request, view, obj):
33-
if request.method in SAFE_METHODS or (obj.leader == request.user):
34-
return True
35-
return False
36-
37-
3815
class IsOwnerOrReadOnly(BasePermission):
3916
"""
4017
Allows access to update only to himself.

invites/__init__.py

Whitespace-only changes.

invites/admin.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from django.contrib import admin
2+
3+
from invites.models import Invite
4+
5+
6+
@admin.register(Invite)
7+
class InviteAdmin(admin.ModelAdmin):
8+
fields = [""]

invites/apps.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.apps import AppConfig
2+
3+
4+
class InvitesConfig(AppConfig):
5+
default_auto_field = "django.db.models.BigAutoField"
6+
name = "invites"

invites/filters.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from django_filters import rest_framework as filters
2+
3+
from invites.models import Invite
4+
5+
6+
class InviteFilter(filters.FilterSet):
7+
"""Filter for Invite
8+
9+
Adds filtering to DRF list retrieve views
10+
11+
Parameters to filter by:
12+
project (int), is_active (default to True if not set otherwise) (boolean)
13+
14+
Examples:
15+
?project=1 equals to .filter(project_id=1)
16+
(no params passed) equals to .filter(is_active=True)
17+
?is_active=false equals to .filter(is_active=False)
18+
"""
19+
20+
def __init__(self, *args, **kwargs):
21+
"""if is_active filter is not passed, default to True"""
22+
super().__init__(*args, **kwargs)
23+
if self.data.get("is_active") is None:
24+
self.data = dict(self.data)
25+
self.data["is_active"] = True
26+
27+
is_active = filters.BooleanFilter(field_name="is_active")
28+
29+
class Meta:
30+
model = Invite
31+
fields = ("project", "is_active")

invites/managers.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.db.models import Manager
2+
3+
4+
class InviteManager(Manager):
5+
def get_invite_for_list_view(self):
6+
return self.get_queryset().select_related("project", "user")

invites/migrations/0001_initial.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# Generated by Django 4.1.2 on 2022-11-09 12:03
2+
3+
from django.conf import settings
4+
from django.db import migrations, models
5+
import django.db.models.deletion
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
initial = True
11+
12+
dependencies = [
13+
("projects", "0005_alter_project_collaborators_and_more"),
14+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
15+
]
16+
17+
operations = [
18+
migrations.CreateModel(
19+
name="Invite",
20+
fields=[
21+
(
22+
"id",
23+
models.BigAutoField(
24+
auto_created=True,
25+
primary_key=True,
26+
serialize=False,
27+
verbose_name="ID",
28+
),
29+
),
30+
(
31+
"motivational_letter",
32+
models.TextField(
33+
blank=True, default=None, max_length=4096, null=True
34+
),
35+
),
36+
("role", models.CharField(blank=True, max_length=128, null=True)),
37+
("is_accepted", models.BooleanField(default=None, null=True)),
38+
(
39+
"datetime_created",
40+
models.DateTimeField(auto_now_add=True, verbose_name="Дата создания"),
41+
),
42+
(
43+
"datetime_updated",
44+
models.DateTimeField(auto_now=True, verbose_name="Дата обновления"),
45+
),
46+
(
47+
"project",
48+
models.ForeignKey(
49+
on_delete=django.db.models.deletion.CASCADE, to="projects.project"
50+
),
51+
),
52+
(
53+
"user",
54+
models.ForeignKey(
55+
on_delete=django.db.models.deletion.CASCADE,
56+
to=settings.AUTH_USER_MODEL,
57+
),
58+
),
59+
],
60+
options={
61+
"verbose_name": "Приглашение",
62+
"verbose_name_plural": "Приглашения",
63+
"ordering": ["-datetime_created"],
64+
},
65+
),
66+
]

invites/migrations/__init__.py

Whitespace-only changes.

invites/models.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from django.db import models
2+
3+
from invites.managers import InviteManager
4+
from projects.models import Project
5+
from users.models import CustomUser
6+
7+
8+
class Invite(models.Model):
9+
"""Invite model
10+
11+
This model is used to store the information about the invitation to the project.
12+
13+
Attributes:
14+
project: A ForeignKey referring to the Project model, who sent out the invite
15+
user: A ForeignKey referring to the user, who got the invite
16+
motivational_letter: A TextField where the project can tell the user why they need him
17+
is_accepted: A BooleanField indicating whether the receiver accepted the invite or declined it
18+
datetime_created: A DateTimeField indicating date of creation
19+
datetime_updated: A DateTimeField indicating date of update
20+
"""
21+
22+
project = models.ForeignKey(Project, on_delete=models.CASCADE)
23+
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
24+
25+
motivational_letter = models.TextField(
26+
max_length=4096, blank=True, null=True, default=None
27+
)
28+
role = models.CharField(max_length=128, blank=True, null=True)
29+
is_accepted = models.BooleanField(blank=False, null=True, default=None)
30+
31+
datetime_created = models.DateTimeField(
32+
verbose_name="Дата создания", null=False, auto_now_add=True
33+
)
34+
datetime_updated = models.DateTimeField(
35+
verbose_name="Дата обновления", null=False, auto_now=True
36+
)
37+
38+
objects = InviteManager()
39+
40+
def __str__(self):
41+
return f'Invite from "{self.project.name}" to {self.user.get_full_name()}'
42+
43+
class Meta:
44+
verbose_name = "Приглашение"
45+
verbose_name_plural = "Приглашения"
46+
ordering = ["-datetime_created"]

0 commit comments

Comments
 (0)