class UserEditForm(ModelForm): full_name = forms.CharField( label="Имя", required=True, max_length=128 ) avatar = ImageUploadField( label="Аватар", required=False, resize=(512, 512), convert_to="jpg", ) city = forms.CharField( label="Город", required=True, max_length=120 ) country = forms.ChoiceField( label="Страна", choices=COUNTRIES, required=True ) bio = forms.CharField( label="Краткая строчка о себе", required=False, max_length=256, widget=forms.Textarea(attrs={"maxlength": 256}), ) company = forms.CharField( label="Компания", required=False, max_length=128 ) position = forms.CharField( label="Должность", required=True, max_length=128 ) email_digest_type = forms.ChoiceField( label="Подписка на дайджест", required=True, choices=User.EMAIL_DIGEST_TYPES, initial=User.EMAIL_DIGEST_TYPE_WEEKLY, widget=forms.RadioSelect(), ) class Meta: model = User fields = [ "full_name", "avatar", "company", "position", "city", "country", "bio", "email_digest_type", ]
class UserEditForm(ModelForm): full_name = forms.CharField( label="Имя", required=True, max_length=128 ) avatar = ImageUploadField( label="Обновить аватар", required=False, resize=(512, 512), convert_to="jpg", ) city = forms.CharField( label="город", required=True, max_length=120 ) country = forms.ChoiceField( label="Страна", choices=COUNTRIES, required=True ) bio = forms.CharField( label="Ссылочки на себя и всякое такое", required=False, max_length=256, widget=forms.Textarea(attrs={"maxlength": 256}), ) company = forms.CharField( label="Компания", required=False, max_length=128 ) position = forms.CharField( label="Должность или что вы делаете", required=True, max_length=128 ) contact = forms.CharField( label="Контакт для связи", required=False, max_length=256, ) class Meta: model = User fields = [ "full_name", "avatar", "company", "position", "city", "country", "bio", "contact", ]
class UserAdminForm(forms.Form): add_hat = forms.BooleanField(label="Выдать новую шапку", required=False) new_hat = forms.ChoiceField( label="Выбрать из популярных", choices=[(None, "---")] + [(key, value.get("title")) for key, value in HATS.items()], required=False, ) new_hat_name = forms.CharField(label="Создать новый титул", max_length=48, required=False) new_hat_icon = ImageUploadField( label="Иконка", required=False, resize=(256, 256), ) new_hat_color = forms.CharField(label="Цвет", initial="#000000", max_length=16, required=False) remove_hat = forms.BooleanField(label="Удалить текущую шапку", required=False) add_achievement = forms.BooleanField(label="Выдать новую ачивку", required=False) new_achievement = forms.ChoiceField( label="Выбрать", choices=[(None, "---")] + [(key, value.get("title")) for key, value in ACHIEVEMENTS.items()], required=False, ) is_banned = forms.BooleanField(label="Забанить", required=False) ban_days = forms.IntegerField(label="Бан истечет через N дней", initial=5, required=False) ban_reason = forms.CharField(label="Причина бана", max_length=128, required=False) is_rejected = forms.BooleanField(label="Размодерирвать", required=False)
class UserIntroForm(ModelForm): slug = forms.CharField( label="Никнейм", required=True, max_length=32, min_length=3, widget=forms.TextInput(attrs={ "pattern": "[A-Za-z0-9_-]+", "minlength": 3, }), ) full_name = forms.CharField( label="Имя", required=True, max_length=128 ) email = forms.EmailField( label="E-mail", required=True ) avatar = ImageUploadField( label="Аватар", required=False, resize=(512, 512), convert_to="jpg", ) city = forms.CharField( label="Город", required=True, max_length=120 ) country = forms.ChoiceField( label="Страна", choices=COUNTRIES, required=True ) bio = forms.CharField( label="Краткая строчка о себе", required=False, max_length=512, widget=forms.Textarea(attrs={"maxlength": 512}), ) company = forms.CharField( label="Компания", required=False, max_length=128 ) position = forms.CharField( label="Должность", required=True, max_length=128 ) intro = forms.CharField( label="#intro", required=True, widget=forms.Textarea( attrs={ "maxlength": 10000, "minlength": 400, "placeholder": "Расскажите Клубу о себе...", } ), ) email_digest_type = forms.ChoiceField( label="Подписка на дайджест", required=True, choices=User.EMAIL_DIGEST_TYPES, initial=User.EMAIL_DIGEST_TYPE_WEEKLY, widget=forms.RadioSelect(), ) privacy_policy_accepted = forms.BooleanField( label="Даю согласие на обработку своих персональных данных", required=True ) class Meta: model = User fields = [ "slug", "full_name", "email", "avatar", "company", "position", "city", "country", "bio", "email_digest_type", ] def clean_slug(self): slug = self.cleaned_data["slug"] slug = str(slug).strip() if slug: if not re.match(r"^[a-zA-Z0-9-_]+$", slug): raise ValidationError("В нике использованы недопустимые знаки") is_exists = ( User.objects.filter(slug__iexact=slug) .exclude(id=self.instance.id if self.instance else None) .exists() ) if not is_exists: return slug raise ValidationError("Пользователь с таким ником уже существует. Выберите другой")
class UserIntroForm(ModelForm): slug = forms.CharField( label="Никнейм", required=True, max_length=32, min_length=3, widget=forms.TextInput(attrs={ "pattern": "[A-Za-z0-9_-]+", "minlength": 3, }), ) full_name = forms.CharField(label="Имя", required=True, max_length=128) email = forms.EmailField(label="E-mail", required=True) avatar = ImageUploadField(label="Аватар", required=False, resize=(512, 512)) city = forms.CharField(label="Город", required=True, max_length=120) country = forms.ChoiceField(label="Страна", choices=COUNTRIES, required=True) bio = forms.CharField( label="Краткая строчка о себе", required=False, max_length=512, widget=forms.Textarea(attrs={"maxlength": 512}), ) company = forms.CharField(label="Компания", required=False, max_length=128) position = forms.CharField(label="Должность", required=True, max_length=128) intro = forms.CharField( label="#intro", required=True, widget=forms.Textarea( attrs={ "maxlength": 5000, "class": "markdown-editor-invisible", "placeholder": "Писать о себе всегда сложно, так что вот какой план:" "\n\n- Расскажите чем вы занимаетесь и где сейчас работаете?" "\n- Из какого вы города и как там оказались?" "\n- Что делаете в свободное от работы время?" "\n- Может у вас есть странная привычка или хобби?" "\n- О чем вы мечтаете?" "\n- Какой из последних постов Вастрика вам понравился больше всего?", }), ) email_digest_type = forms.ChoiceField( label="Подписка на дайджест", required=True, choices=User.EMAIL_DIGEST_TYPES, initial=User.EMAIL_DIGEST_TYPE_WEEKLY, widget=forms.RadioSelect(), ) privacy_policy_accepted = forms.BooleanField( label="Даю согласие на обработку своих персональных данных", required=True) class Meta: model = User fields = [ "slug", "full_name", "email", "avatar", "company", "position", "city", "country", "bio", "email_digest_type", ] def clean_slug(self): slug = self.cleaned_data["slug"] slug = str(slug).strip() if slug: if not re.match(r"^[a-zA-Z0-9-_]+$", slug): raise ValidationError("В нике использованы недопустимые знаки") is_exists = (User.objects.filter(slug__iexact=slug).exclude( id=self.instance.id if self.instance else None).exists()) if not is_exists: return slug raise ValidationError( "Пользователь с таким ником уже существует. Выберите другой")
class PostProjectForm(PostForm): title = forms.CharField( label="Название проекта", required=True, max_length=128, widget=forms.TextInput(attrs={"placeholder": "Название проекта 🏗"}), ) url = forms.URLField( label="Ссылка на страницу проекта 👇", required=True, widget=forms.TextInput(attrs={"placeholder": "https://"}), ) image = ImageUploadField( label="Скриншот или иконка", required=True, resize=(1024, 1024), ) text = forms.CharField( label="Описание", required=True, initial="🤗 Расскажите здесь все подробности о вашем проекте.\n\n " "Этот текст можете смело удалять. Он здесь лишь для того, чтобы помочь вам с проблемой чистого листа " "и задать базовую структуру. Главное — чтобы это было полезно. " "Можете добавлять или изменять вопросы, чтобы они лучше описывали ваш случай.\n\n" "### Расскажите о себе и сути проекта?\n\n\n\n" "### Как появилась идея? Что вдохновило?\n\n\n\n" "### Что вошло в прототип и сколько времени на него было потрачено?\n\n\n\n" "### Какой технологический стек вы использовали? Почему?\n\n\n\n" "### Как вы запускались и искали первых пользователей?\n\n\n\n" "### С какими самыми неожиданными трудностями пришлось столкнуться?\n\n\n\n" "### Сколько потратили и заработали? Есть идеи как это можно монетизировать?\n\n\n\n" "### Какие планы на будущее?\n\n\n\n" "### Нужны ли какие-то советы или помощь Клуба?\n\n\n\n" "### Какой совет вы бы сами могли дать идущим по вашим стопам?\n\n", max_length=500000, widget=forms.Textarea( attrs={ "maxlength": 500000, "class": "markdown-editor-full", "placeholder": "Расскажите подробности о вашем проекте!" "\n- В чем его суть и как он помогает людям?" "\n- Как появилась идея?" "\n- Какой технический стек вы использовали?" "\n- С какими самыми неожиданными трудностями вы столкнулись?" "\n- Сколько в итоге потратили и заработали?" "\n- Нужны ли какие-то советы или помошь Клуба?" } ), ) class Meta: model = Post fields = [ "title", "text", "topic", "url", "image", "is_visible", "is_public" ]