felicity-lims/felicity/apps/noticeboard/services.py

94 lines
3.4 KiB
Python
Raw Normal View History

2024-07-22 16:20:56 +08:00
from felicity.apps.abstract.service import BaseService
from felicity.apps.noticeboard.entities import Notice
from felicity.apps.noticeboard.repository import NoticeRepository
from felicity.apps.noticeboard.schemas import NoticeCreate, NoticeUpdate
from felicity.apps.setup.entities.setup import Department
from felicity.apps.setup.services import DepartmentService
from felicity.apps.user.entities import Group, User
from felicity.apps.user.services import GroupService, UserService
class NoticeService(BaseService[Notice, NoticeCreate, NoticeUpdate]):
def __init__(self):
self.group_service = GroupService()
self.department_service = DepartmentService()
self.user_service = UserService()
2024-09-25 00:12:10 +08:00
self.repository: NoticeRepository = NoticeRepository()
super().__init__(self.repository)
2024-07-21 15:06:51 +08:00
async def filter(
2024-07-28 03:52:31 +08:00
self,
group_uid: str | None,
department_uid: str | None,
2024-07-21 15:06:51 +08:00
) -> list[Notice]:
filters = {}
if group_uid:
filters["groups__uid__in"] = [group_uid]
if department_uid:
filters["departments__uid__in"] = [department_uid]
2024-09-25 00:12:10 +08:00
return await super().repository.filter(
filters=filters, sort_attrs=["-created_at"]
)
2024-07-21 15:06:51 +08:00
async def view(self, uid: str, viewer_uid: str) -> Notice:
notice = await self.get(uid=uid)
_viewer = await self.user_service.get(uid=viewer_uid)
return await self.add_viewer(notice, _viewer)
async def delete(self, uid: str):
2024-07-24 04:30:01 +08:00
await super().delete(uid)
2024-07-21 15:06:51 +08:00
2024-07-24 04:30:01 +08:00
async def reset_views(self, uid: str) -> Notice:
notice = await self.get(uid=uid)
2024-07-21 15:06:51 +08:00
notice.viewers.clear()
2024-07-28 03:52:31 +08:00
return await super().save(notice)
2024-07-21 15:06:51 +08:00
2024-07-24 04:30:01 +08:00
async def remove_viewer(self, uid: str, user: User) -> Notice:
notice = await self.get(uid=uid)
2024-07-21 15:06:51 +08:00
notice.viewers.remove(user)
2024-07-28 03:52:31 +08:00
return await super().save(notice)
2024-07-21 15:06:51 +08:00
2024-07-24 04:30:01 +08:00
async def add_viewer(self, uid: str, user: User) -> Notice:
notice = await self.get(uid=uid)
2024-07-21 15:06:51 +08:00
if user not in notice.viewers:
notice.viewers.append(user)
2024-07-28 03:52:31 +08:00
return await super().save(notice)
2024-07-21 15:06:51 +08:00
return notice
2024-07-24 04:30:01 +08:00
async def reset_departments(self, uid: str) -> Notice:
notice = await self.get(uid=uid)
2024-07-21 15:06:51 +08:00
notice.departments.clear()
2024-07-28 03:52:31 +08:00
return await super().save(notice)
2024-07-21 15:06:51 +08:00
2024-07-24 04:30:01 +08:00
async def remove_department(self, uid: str, department: Department) -> Notice:
notice = await self.get(uid=uid)
2024-07-21 15:06:51 +08:00
notice.departments.remove(department)
2024-07-28 03:52:31 +08:00
return await super().save(notice)
2024-07-21 15:06:51 +08:00
2024-07-24 04:30:01 +08:00
async def add_department(self, uid: str, department: Department) -> Notice:
notice = await self.get(uid=uid)
2024-07-21 15:06:51 +08:00
if department not in notice.departments:
notice.departments.append(department)
2024-07-28 03:52:31 +08:00
return await super().save(notice)
2024-07-21 15:06:51 +08:00
return notice
2024-07-24 04:30:01 +08:00
async def reset_groups(self, uid: str) -> Notice:
notice = await self.get(uid=uid)
2024-07-21 15:06:51 +08:00
notice.groups.clear()
2024-07-28 03:52:31 +08:00
return await super().save(notice)
2024-07-21 15:06:51 +08:00
2024-07-24 04:30:01 +08:00
async def remove_group(self, uid: str, group: Group) -> Notice:
notice = await self.get(uid=uid)
2024-07-21 15:06:51 +08:00
notice.groups.remove(group)
2024-07-28 03:52:31 +08:00
return await super().save(notice)
2024-07-21 15:06:51 +08:00
2024-07-24 04:30:01 +08:00
async def add_group(self, uid: str, group: Group) -> Notice:
notice = await self.get(uid=uid)
2024-07-21 15:06:51 +08:00
if group not in notice.groups:
notice.groups.append(group)
2024-07-28 03:52:31 +08:00
return await super().save(notice)
2024-07-21 15:06:51 +08:00
return notice