Skip to content

Commit 68b8c20

Browse files
authored
Merge pull request #148 from PROCOLLAB-github/dev
Files for project news
2 parents 42087cd + d1c0279 commit 68b8c20

10 files changed

Lines changed: 97 additions & 5 deletions

File tree

core/models.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ class Like(Model):
2424
)
2525
object_id = models.PositiveIntegerField()
2626
content_object = GenericForeignKey("content_type", "object_id")
27-
# is liked?
2827

2928
class Meta:
3029
unique_together = ("user", "content_type", "object_id")

files/admin.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,32 @@
66
@admin.register(UserFile)
77
class UserFileAdmin(admin.ModelAdmin):
88
list_display = (
9+
"short_link",
10+
"filename",
11+
"user",
12+
"datetime_uploaded",
13+
)
14+
list_display_links = (
15+
"short_link",
16+
"filename",
17+
"user",
18+
)
19+
search_fields = (
920
"link",
21+
"user__first_name",
22+
"user__last_name",
23+
)
24+
list_filter = (
1025
"user",
1126
"datetime_uploaded",
1227
)
13-
list_display_links = ("link",)
28+
29+
date_hierarchy = "datetime_uploaded"
30+
31+
@admin.display(empty_value="Empty filename")
32+
def filename(self, obj):
33+
return obj.name
34+
35+
@admin.display(empty_value="Empty link")
36+
def short_link(self, obj):
37+
return obj.link[15:40] + "..." + obj.link[-20:]

files/models.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@ class UserFile(models.Model):
99
UserFile model
1010
1111
Attributes:
12-
user: User who uploaded the file
1312
link: Link to the file on the CDN
13+
user: User who uploaded the file
1414
datetime_uploaded: Datetime when the file was uploaded
15+
name: Name of the file
16+
extension: Extension of the file
17+
size: Size of the file in bytes
1518
"""
1619

17-
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
1820
link = models.URLField(primary_key=True, null=False)
21+
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
1922
datetime_uploaded = models.DateTimeField(auto_now_add=True)
2023
name = models.TextField(blank=False, default="file")
2124
extension = models.TextField(blank=True, default="")

projects/admin.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ class ProjectNewsAdmin(admin.ModelAdmin):
2828
"project",
2929
"datetime_created",
3030
)
31+
# todo: set up admin panel for files
32+
filter_horizontal = ("files",)
3133

3234

3335
@admin.register(Achievement)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Generated by Django 4.2 on 2023-06-14 08:13
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("files", "0003_userfile_extension_userfile_name_userfile_size"),
10+
("projects", "0014_alter_projectnews_options_and_more"),
11+
]
12+
13+
operations = [
14+
migrations.AddField(
15+
model_name="projectnews",
16+
name="files",
17+
field=models.ManyToManyField(
18+
related_name="projects_news", to="files.userfile"
19+
),
20+
),
21+
]
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Generated by Django 4.2 on 2023-06-14 08:36
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("files", "0003_userfile_extension_userfile_name_userfile_size"),
10+
("projects", "0015_projectnews_files"),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name="projectnews",
16+
name="files",
17+
field=models.ManyToManyField(
18+
blank=True, related_name="projects_news", to="files.userfile"
19+
),
20+
),
21+
]

projects/models.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from django.db.models import UniqueConstraint
77

88
from core.models import Like, View
9+
from files.models import UserFile
910
from industries.models import Industry
1011
from projects.constants import VERBOSE_STEPS
1112
from projects.managers import AchievementManager, ProjectManager
@@ -207,6 +208,9 @@ class ProjectNews(models.Model):
207208
null=False,
208209
blank=False,
209210
)
211+
# todo: remove files unused files
212+
files = models.ManyToManyField(UserFile, related_name="projects_news", blank=True)
213+
210214
views = GenericRelation(
211215
View,
212216
related_query_name="project_views",
@@ -215,7 +219,6 @@ class ProjectNews(models.Model):
215219
Like,
216220
related_query_name="project_news",
217221
)
218-
# todo: files
219222

220223
datetime_created = models.DateTimeField(
221224
verbose_name="Дата создания",

projects/pagination.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from rest_framework import pagination
2+
3+
4+
class ProjectNewsPagination(pagination.LimitOffsetPagination):
5+
"""
6+
Pagination for project news
7+
8+
For example:
9+
/projects/1/news/?limit=10&offset=10
10+
gets the next 10 news after the first 10 news.
11+
"""
12+
13+
default_limit = 5
14+
limit_query_param = "limit"
15+
offset_query_param = "offset"

projects/serializers.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ class Meta:
238238
"datetime_created",
239239
"views_count",
240240
"likes_count",
241+
"files",
241242
]
242243

243244

@@ -270,4 +271,5 @@ class Meta:
270271
"datetime_updated",
271272
"views_count",
272273
"likes_count",
274+
"files",
273275
]

projects/views.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from projects.constants import VERBOSE_STEPS
1414
from projects.helpers import get_recommended_users, check_related_fields_update
1515
from projects.models import Project, Achievement, ProjectNews
16+
from projects.pagination import ProjectNewsPagination
1617
from projects.permissions import (
1718
IsProjectLeaderOrReadOnlyForNonDrafts,
1819
HasInvolvementInProjectOrReadOnly,
@@ -233,6 +234,7 @@ def get(self, request, pk):
233234
class ProjectNewsList(generics.ListCreateAPIView):
234235
serializer_class = ProjectNewsListSerializer
235236
permission_classes = [IsNewsAuthorIsProjectLeaderOrReadOnly]
237+
pagination_class = ProjectNewsPagination
236238

237239
def perform_create(self, serializer):
238240
project = Project.objects.get(pk=self.kwargs.get("project_pk"))

0 commit comments

Comments
 (0)