Skip to content

Commit cfc6f62

Browse files
authored
Merge pull request #154 from PROCOLLAB-github/feature/partner-programs
Feature/partner programs
2 parents 7efe6f2 + da5207f commit cfc6f62

24 files changed

Lines changed: 972 additions & 130 deletions

core/migrations/0003_link.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# Generated by Django 4.1.3 on 2023-07-08 17:05
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
("contenttypes", "0002_remove_content_type_name"),
11+
("core", "0002_view"),
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name="Link",
17+
fields=[
18+
(
19+
"id",
20+
models.BigAutoField(
21+
auto_created=True,
22+
primary_key=True,
23+
serialize=False,
24+
verbose_name="ID",
25+
),
26+
),
27+
("link", models.URLField(verbose_name="Ссылка")),
28+
("object_id", models.PositiveIntegerField()),
29+
(
30+
"content_type",
31+
models.ForeignKey(
32+
on_delete=django.db.models.deletion.CASCADE,
33+
related_name="links",
34+
to="contenttypes.contenttype",
35+
),
36+
),
37+
],
38+
options={
39+
"verbose_name": "Ссылка",
40+
"verbose_name_plural": "Ссылки",
41+
"unique_together": {("content_type", "object_id")},
42+
},
43+
),
44+
]

core/models.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,31 @@
77
User = get_user_model()
88

99

10+
class Link(Model):
11+
"""
12+
Generic Link model based on contenttype
13+
"""
14+
15+
link = models.URLField(
16+
verbose_name="Ссылка",
17+
)
18+
content_type = models.ForeignKey(
19+
ContentType,
20+
on_delete=models.CASCADE,
21+
related_name="links",
22+
)
23+
object_id = models.PositiveIntegerField()
24+
content_object = GenericForeignKey("content_type", "object_id")
25+
26+
class Meta:
27+
unique_together = ("content_type", "object_id")
28+
verbose_name = "Ссылка"
29+
verbose_name_plural = "Ссылки"
30+
31+
def __str__(self):
32+
return f"Link for {self.content_object} - {self.link}"
33+
34+
1035
class Like(Model):
1136
"""
1237
Generic Like model based on contenttype

core/services.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from django.contrib.auth import get_user_model
22
from django.contrib.contenttypes.models import ContentType
33

4-
from core.models import Like, View
4+
from core.models import Like, View, Link
55

66
User = get_user_model()
77

@@ -86,3 +86,21 @@ def set_viewed(obj, user, is_viewed):
8686
add_view(obj, user)
8787
else:
8888
remove_view(obj, user)
89+
90+
91+
def add_link(obj, link: str):
92+
obj_type = ContentType.objects.get_for_model(obj)
93+
like, is_created = Link.objects.get_or_create(
94+
content_type=obj_type, object_id=obj.id, link=link
95+
)
96+
return like
97+
98+
99+
def remove_link(obj, link):
100+
obj_type = ContentType.objects.get_for_model(obj)
101+
Like.objects.filter(content_type=obj_type, object_id=obj.id, link=link).delete()
102+
103+
104+
def get_links(obj):
105+
obj_type = ContentType.objects.get_for_model(obj)
106+
return Link.objects.filter(content_type=obj_type, object_id=obj.id)

news/managers.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from django.contrib.contenttypes.models import ContentType
2+
from django.db import models
3+
4+
5+
class NewsManager(models.Manager):
6+
def get_news(self, obj):
7+
obj_type = ContentType.objects.get_for_model(obj)
8+
return self.get_queryset().filter(content_type=obj_type, object_id=obj.id)
9+
10+
def add_news(self, obj, **kwargs):
11+
obj_type = ContentType.objects.get_for_model(obj)
12+
news = self.create(content_type=obj_type, object_id=obj.id, **kwargs)
13+
return news
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Generated by Django 4.1.3 on 2023-07-08 18:58
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
("contenttypes", "0002_remove_content_type_name"),
11+
("news", "0004_alter_news_tags"),
12+
]
13+
14+
operations = [
15+
migrations.AddField(
16+
model_name="news",
17+
name="content_type",
18+
field=models.ForeignKey(
19+
default=0,
20+
on_delete=django.db.models.deletion.CASCADE,
21+
to="contenttypes.contenttype",
22+
),
23+
preserve_default=False,
24+
),
25+
migrations.AddField(
26+
model_name="news",
27+
name="object_id",
28+
field=models.PositiveIntegerField(default=0),
29+
preserve_default=False,
30+
),
31+
]

news/models.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
from django.contrib.contenttypes.models import ContentType
12
from django.db import models
23

4+
from news.managers import NewsManager
5+
36

47
class NewsTag(models.Model):
58
"""News tag model
@@ -52,13 +55,19 @@ class News(models.Model):
5255

5356
tags = models.ManyToManyField(NewsTag, blank=True, verbose_name="Список тегов")
5457

58+
# generic relation to project/program/ something else possibly
59+
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
60+
object_id = models.PositiveIntegerField()
61+
5562
datetime_created = models.DateTimeField(
5663
verbose_name="Дата создания", null=False, auto_now_add=True
5764
)
5865
datetime_updated = models.DateTimeField(
5966
verbose_name="Дата изменения", null=False, auto_now=True
6067
)
6168

69+
objects = NewsManager()
70+
6271
@property
6372
def tags_str(self):
6473
"""Formats tags to string

0 commit comments

Comments
 (0)