Добавление рабочих аватарок и фонов профиля

This commit is contained in:
VladislavOstapov 2023-03-28 22:19:22 +03:00
parent ca5ddec512
commit f200ec0bef
2 changed files with 43 additions and 7 deletions

View File

@ -1,5 +1,4 @@
import time import time
from django.core.exceptions import ValidationError
from .api_media_utils import * from .api_media_utils import *
from .api_utils import * from .api_utils import *
from .models import * from .models import *
@ -56,7 +55,7 @@ class ApiAccount:
if hasattr(user, 'accountavatar'): if hasattr(user, 'accountavatar'):
obj["avatar"] = user.accountavatar.photo.id if user.accountavatar.photo is not None else None obj["avatar"] = user.accountavatar.photo.id if user.accountavatar.photo is not None else None
obj["profile_background"] = \ obj["profile_background"] = \
user.accountavatar.profile_background.id if user.accountavatar.photo is not None else None user.accountavatar.profile_background.id if user.accountavatar.profile_background is not None else None
else: else:
obj["avatar"] = None obj["avatar"] = None
obj["profile_background"] = None obj["profile_background"] = None
@ -102,6 +101,7 @@ class ApiAccount:
user = await Account.objects.acreate(phone=phone, password=password, role=role) user = await Account.objects.acreate(phone=phone, password=password, role=role)
if role == Account.ROLE_EXECUTOR: if role == Account.ROLE_EXECUTOR:
await ExecutorAccount.objects.acreate(account=user) await ExecutorAccount.objects.acreate(account=user)
await AccountAvatar.objects.acreate(account=user, photo=None, profile_background=None)
# удаляем код, типа завершение транзакции # удаляем код, типа завершение транзакции
PhoneVerificationService.check_code(phone, code, auto_pop=True) PhoneVerificationService.check_code(phone, code, auto_pop=True)
@ -185,10 +185,14 @@ class ApiAccount:
description="ИНН исполнителя (только для роли исполнитель): " description="ИНН исполнителя (только для роли исполнитель): "
"12 цифр если исполнитель - физ.лицо и 10 цифр если это юр. лицо"), "12 цифр если исполнитель - физ.лицо и 10 цифр если это юр. лицо"),
ApiParamEnum(name="city", description="Город, в котором находится ползователь: {choices}", ApiParamEnum(name="city", description="Город, в котором находится ползователь: {choices}",
required=False, choices=CITIES_CHOICES) required=False, choices=CITIES_CHOICES),
ApiParamInt(name="photo", required=False, default=None,
description="ID медиа, которое будет использоваться в качестве фото профиля"),
ApiParamInt(name="profile_background", required=False, default=None,
description="ID медиа, которое будет использоваться в качестве банера профиля")
], ],
returns="Вернет основную информацию о пользователе, иначе ошибки") returns="Вернет основную информацию о пользователе, иначе ошибки")
async def edit(access_token, name, surname, about, executor_type, executor_inn, city): async def edit(access_token, name, surname, about, executor_type, executor_inn, city, photo, profile_background):
user = access_token.user user = access_token.user
executor_need_save, need_save = False, False executor_need_save, need_save = False, False
@ -208,6 +212,32 @@ class ApiAccount:
user.city = city user.city = city
need_save = True need_save = True
if photo is not None:
p = await Media.objects.filter(pk=photo).select_related('owner').afirst()
if p is None:
raise Exception(API_ERROR_NOT_FOUND, 'field "photo" not found')
if p.owner.id == user.id and (p.extension == 'jpeg' or p.extension == 'png'):
if not hasattr(user, 'accountavatar'):
user.accountavatar = await AccountAvatar.objects.acreate(account=user)
user.accountavatar.photo = p
need_save = True
else:
raise Exception(API_ERROR_NOT_FOUND, 'field "photo" not correct')
if profile_background is not None:
p = await Media.objects.filter(pk=profile_background).select_related('owner').afirst()
if p is None:
raise Exception(API_ERROR_NOT_FOUND, 'field "profile_background" not found')
if p.owner.id == user.id and p.extension == 'jpeg':
if not hasattr(user, 'accountavatar'):
user.accountavatar = await AccountAvatar.objects.acreate(account=user)
user.accountavatar.profile_background = p
need_save = True
else:
raise Exception(API_ERROR_NOT_FOUND, 'field "profile_background" not correct')
if user.role == Account.ROLE_EXECUTOR: if user.role == Account.ROLE_EXECUTOR:
print("Executor account detected") print("Executor account detected")
if executor_type is not None: if executor_type is not None:

View File

@ -120,7 +120,7 @@ class Media(models.Model):
class AccountAvatar(models.Model): class AccountAvatar(models.Model):
account = models.OneToOneField(Account, on_delete=models.CASCADE, related_name="account", verbose_name="Аккаунт") account = models.OneToOneField(Account, on_delete=models.CASCADE, verbose_name="Аккаунт")
photo = models.ForeignKey(Media, on_delete=models.SET_NULL, null=True, photo = models.ForeignKey(Media, on_delete=models.SET_NULL, null=True,
related_name="photo", verbose_name="Аватар") related_name="photo", verbose_name="Аватар")
profile_background = models.ForeignKey(Media, on_delete=models.SET_NULL, null=True, default=None, profile_background = models.ForeignKey(Media, on_delete=models.SET_NULL, null=True, default=None,
@ -192,8 +192,14 @@ class AccessToken(models.Model):
@staticmethod @staticmethod
async def get_by_token(token: str): async def get_by_token(token: str):
t = await AccessToken.objects.filter(access_token=token).select_related('user', related = [
'user__executoraccount').afirst() 'user',
'user__accountavatar',
'user__accountavatar__profile_background',
'user__accountavatar__photo',
'user__executoraccount'
]
t = await AccessToken.objects.filter(access_token=token).select_related(*related).afirst()
if t is None: if t is None:
raise Exception(API_ERROR_INVALID_TOKEN) raise Exception(API_ERROR_INVALID_TOKEN)
return t return t