diff --git a/api/api_methods.py b/api/api_methods.py index 4369935..1b6f8db 100755 --- a/api/api_methods.py +++ b/api/api_methods.py @@ -1,5 +1,4 @@ import time -from django.core.exceptions import ValidationError from .api_media_utils import * from .api_utils import * from .models import * @@ -56,7 +55,7 @@ class ApiAccount: if hasattr(user, 'accountavatar'): obj["avatar"] = user.accountavatar.photo.id if user.accountavatar.photo is not None else None 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: obj["avatar"] = None obj["profile_background"] = None @@ -102,6 +101,7 @@ class ApiAccount: user = await Account.objects.acreate(phone=phone, password=password, role=role) if role == Account.ROLE_EXECUTOR: 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) @@ -185,10 +185,14 @@ class ApiAccount: description="ИНН исполнителя (только для роли исполнитель): " "12 цифр если исполнитель - физ.лицо и 10 цифр если это юр. лицо"), 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="Вернет основную информацию о пользователе, иначе ошибки") - 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 executor_need_save, need_save = False, False @@ -208,6 +212,32 @@ class ApiAccount: user.city = city 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: print("Executor account detected") if executor_type is not None: diff --git a/api/models.py b/api/models.py index 55d1af5..7c9b060 100755 --- a/api/models.py +++ b/api/models.py @@ -120,7 +120,7 @@ class Media(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, related_name="photo", verbose_name="Аватар") profile_background = models.ForeignKey(Media, on_delete=models.SET_NULL, null=True, default=None, @@ -192,8 +192,14 @@ class AccessToken(models.Model): @staticmethod async def get_by_token(token: str): - t = await AccessToken.objects.filter(access_token=token).select_related('user', - 'user__executoraccount').afirst() + related = [ + '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: raise Exception(API_ERROR_INVALID_TOKEN) return t