429 lines
15 KiB
Python
429 lines
15 KiB
Python
# links/models.py
|
||
|
||
from django.db import models
|
||
from django.conf import settings
|
||
|
||
class LinkGroup(models.Model):
|
||
"""
|
||
Группа ссылок, принадлежащая пользователю.
|
||
"""
|
||
owner = models.ForeignKey(
|
||
settings.AUTH_USER_MODEL,
|
||
on_delete=models.CASCADE,
|
||
related_name='link_groups', # чтобы не конфликтовать с auth.User.groups
|
||
help_text='Владелец группы ссылок'
|
||
)
|
||
title = models.CharField(
|
||
max_length=100,
|
||
help_text='Название группы'
|
||
)
|
||
order = models.PositiveIntegerField(
|
||
default=0,
|
||
help_text='Порядок сортировки'
|
||
)
|
||
image = models.ImageField(
|
||
upload_to='images/link_groups/',
|
||
null=True,
|
||
blank=True,
|
||
help_text='Изображение группы ссылок'
|
||
)
|
||
created_at = models.DateTimeField(
|
||
auto_now_add=True,
|
||
help_text='Дата и время создания'
|
||
)
|
||
updated_at = models.DateTimeField(
|
||
auto_now=True,
|
||
help_text='Дата и время последнего обновления'
|
||
)
|
||
is_active = models.BooleanField(
|
||
default=True,
|
||
help_text='Активность группы ссылок'
|
||
)
|
||
description = models.TextField(
|
||
blank=True,
|
||
help_text='Описание группы ссылок'
|
||
)
|
||
is_public = models.BooleanField(
|
||
default=False,
|
||
help_text='Публичная группа ссылок'
|
||
)
|
||
is_featured = models.BooleanField(
|
||
default=False,
|
||
help_text='Выделенная группа ссылок'
|
||
)
|
||
is_private = models.BooleanField(
|
||
default=False,
|
||
help_text='Закрытая группа ссылок'
|
||
)
|
||
is_password_protected = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок защищена паролем'
|
||
)
|
||
password = models.CharField(
|
||
max_length=128,
|
||
blank=True,
|
||
help_text='Пароль для доступа к группе ссылок'
|
||
)
|
||
is_approved = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок одобрена администратором'
|
||
)
|
||
is_rejected = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок отклонена администратором'
|
||
)
|
||
is_deleted = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок удалена'
|
||
)
|
||
is_archived = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок архивирована'
|
||
)
|
||
is_scheduled = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок запланирована на публикацию'
|
||
)
|
||
scheduled_at = models.DateTimeField(
|
||
null=True,
|
||
blank=True,
|
||
help_text='Дата и время запланированной публикации'
|
||
)
|
||
is_expired = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок истекла'
|
||
)
|
||
expiration_date = models.DateTimeField(
|
||
null=True,
|
||
blank=True,
|
||
help_text='Дата и время истечения срока действия группы ссылок'
|
||
)
|
||
is_featured_on_homepage = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена на главной странице'
|
||
)
|
||
is_featured_on_profile = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена на профиле пользователя'
|
||
)
|
||
is_featured_on_category = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в категории'
|
||
)
|
||
is_featured_on_tag = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена по тегу'
|
||
)
|
||
is_featured_on_search = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в результатах поиска'
|
||
)
|
||
is_featured_on_related = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в связанных ссылках'
|
||
)
|
||
is_featured_on_recommended = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в рекомендуемых ссылках'
|
||
)
|
||
is_featured_on_popular = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в популярных ссылках'
|
||
)
|
||
is_featured_on_trending = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в трендовых ссылках'
|
||
)
|
||
is_featured_on_new = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в новых ссылках'
|
||
)
|
||
is_featured_on_top = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в верхних ссылках'
|
||
)
|
||
is_featured_on_bottom = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в нижних ссылках'
|
||
)
|
||
is_featured_on_sidebar = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в боковой панели'
|
||
)
|
||
is_featured_on_footer = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в нижнем колонтитуле'
|
||
)
|
||
is_featured_on_header = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в верхнем колонтитуле'
|
||
)
|
||
is_featured_on_banner = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в баннере'
|
||
)
|
||
is_featured_on_popup = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в всплывающем окне'
|
||
)
|
||
is_featured_on_modal = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в модальном окне'
|
||
)
|
||
is_featured_on_notification = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в уведомлении'
|
||
)
|
||
is_featured_on_alert = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в алерте'
|
||
)
|
||
is_featured_on_toast = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в тосте'
|
||
)
|
||
is_featured_on_snackbar = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в снэкбаре'
|
||
)
|
||
is_featured_on_tooltip = models.BooleanField(
|
||
default=False,
|
||
help_text='Группа ссылок выделена в тултипе'
|
||
)
|
||
class Meta:
|
||
ordering = ['order']
|
||
unique_together = ('owner', 'title')
|
||
|
||
def __str__(self):
|
||
return f"{self.owner.username} – {self.title}"
|
||
|
||
class Link(models.Model):
|
||
"""
|
||
Отдельная ссылка внутри группы.
|
||
"""
|
||
group = models.ForeignKey(
|
||
LinkGroup,
|
||
on_delete=models.CASCADE,
|
||
related_name='images/links/',
|
||
help_text='Группа, к которой относится ссылка'
|
||
)
|
||
title = models.CharField(
|
||
max_length=200,
|
||
help_text='Текст ссылки'
|
||
)
|
||
url = models.URLField(
|
||
help_text='URL-адрес'
|
||
)
|
||
order = models.PositiveIntegerField(
|
||
default=0,
|
||
help_text='Порядок сортировки внутри группы'
|
||
)
|
||
is_active = models.BooleanField(
|
||
default=True,
|
||
help_text='Активность ссылки'
|
||
)
|
||
created_at = models.DateTimeField(
|
||
auto_now_add=True,
|
||
help_text='Дата и время создания'
|
||
)
|
||
updated_at = models.DateTimeField(
|
||
auto_now=True,
|
||
help_text='Дата и время последнего обновления'
|
||
)
|
||
image = models.ImageField(
|
||
upload_to='links/',
|
||
null=True,
|
||
blank=True,
|
||
help_text='Изображение ссылки'
|
||
)
|
||
description = models.TextField(
|
||
blank=True,
|
||
help_text='Описание ссылки'
|
||
)
|
||
is_public = models.BooleanField(
|
||
default=False,
|
||
help_text='Публичная ссылка'
|
||
)
|
||
is_featured = models.BooleanField(
|
||
default=False,
|
||
help_text='Выделенная ссылка'
|
||
)
|
||
is_private = models.BooleanField(
|
||
default=False,
|
||
help_text='Закрытая ссылка'
|
||
)
|
||
is_password_protected = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка защищена паролем'
|
||
)
|
||
password = models.CharField(
|
||
max_length=128,
|
||
blank=True,
|
||
help_text='Пароль для доступа к ссылке'
|
||
)
|
||
is_approved = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка одобрена администратором'
|
||
)
|
||
is_rejected = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка отклонена администратором'
|
||
)
|
||
is_deleted = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка удалена'
|
||
)
|
||
is_archived = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка архивирована'
|
||
)
|
||
is_scheduled = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка запланирована на публикацию'
|
||
)
|
||
scheduled_at = models.DateTimeField(
|
||
null=True,
|
||
blank=True,
|
||
help_text='Дата и время запланированной публикации'
|
||
)
|
||
is_expired = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка истекла'
|
||
)
|
||
expiration_date = models.DateTimeField(
|
||
null=True,
|
||
blank=True,
|
||
help_text='Дата и время истечения срока действия ссылки'
|
||
)
|
||
is_featured_on_homepage = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена на главной странице'
|
||
)
|
||
is_featured_on_profile = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена на профиле пользователя'
|
||
)
|
||
is_featured_on_category = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в категории'
|
||
)
|
||
is_featured_on_tag = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена по тегу'
|
||
)
|
||
is_featured_on_search = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в результатах поиска'
|
||
)
|
||
is_featured_on_related = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в связанных ссылках'
|
||
)
|
||
is_featured_on_recommended = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в рекомендуемых ссылках'
|
||
)
|
||
is_featured_on_popular = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в популярных ссылках'
|
||
)
|
||
is_featured_on_trending = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в трендовых ссылках'
|
||
)
|
||
is_featured_on_new = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в новых ссылках'
|
||
)
|
||
is_featured_on_top = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в верхних ссылках'
|
||
)
|
||
is_featured_on_bottom = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в нижних ссылках'
|
||
)
|
||
is_featured_on_sidebar = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в боковой панели'
|
||
)
|
||
is_featured_on_footer = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в нижнем колонтитуле'
|
||
)
|
||
is_featured_on_header = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в верхнем колонтитуле'
|
||
)
|
||
is_featured_on_banner = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в баннере'
|
||
)
|
||
is_featured_on_popup = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в всплывающем окне'
|
||
)
|
||
is_featured_on_modal = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в модальном окне'
|
||
)
|
||
is_featured_on_notification = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в уведомлении'
|
||
)
|
||
is_featured_on_alert = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в алерте'
|
||
)
|
||
is_featured_on_toast = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в тосте'
|
||
)
|
||
is_featured_on_snackbar = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в снэкбаре'
|
||
)
|
||
is_featured_on_tooltip = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в тултипе'
|
||
)
|
||
is_featured_on_qr_code = models.BooleanField(
|
||
default=False,
|
||
help_text='Ссылка выделена в QR-коде'
|
||
)
|
||
class Meta:
|
||
ordering = ['order']
|
||
|
||
def __str__(self):
|
||
return self.title
|
||
|
||
def get_absolute_url(self):
|
||
"""
|
||
Возвращает абсолютный URL для доступа к ссылке.
|
||
"""
|
||
return self.url
|
||
|
||
def get_group(self):
|
||
"""
|
||
Возвращает группу, к которой принадлежит ссылка.
|
||
"""
|
||
return self.group
|
||
|
||
def get_owner(self):
|
||
"""
|
||
Возвращает владельца ссылки.
|
||
"""
|
||
return self.group.owner
|
||
|
||
def get_link_info(self):
|
||
"""
|
||
Возвращает словарь с информацией о ссылке.
|
||
"""
|
||
return {
|
||
'title': self.title,
|
||
'url': self.url,
|
||
'is_active': self.is_active,
|
||
'created_at': self.created_at,
|
||
'updated_at': self.updated_at
|
||
}
|