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, min_length=1500, 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, "minlength": 1500, "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" ]
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 ) new_achievement = forms.ChoiceField( label="Выдать новую ачивку", choices=[(None, "---")] + [(key, value.get("name")) for key, value in ACHIEVEMENTS], 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_unbanned = forms.BooleanField( label="Разбанить", required=False ) is_rejected = forms.BooleanField( label="Размодерирвать", required=False )
class ProfileEditForm(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=1024, widget=forms.Textarea(attrs={"maxlength": 1024}), ) company = forms.CharField( label="Компания", required=True, max_length=128 ) position = forms.CharField( label="Должность или что вы делаете", required=True, max_length=128 ) contact = forms.CharField( label="Контакт для связи", required=True, max_length=256, ) class Meta: model = User fields = [ "full_name", "avatar", "company", "position", "city", "country", "bio", "contact", ]
class UserAdminForm(forms.Form): role_action = forms.ChoiceField( label="Выбрать действие", choices=[(None, "---"), ("add", "Добавить роль"), ("delete", "Удалить роль")], required=False, ) role = forms.ChoiceField( label="Выбрать роль", choices=[(None, "---")] + User.ROLES, required=False, ) 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) new_achievement = forms.ChoiceField( label="Выдать новую ачивку", choices=[(None, "---")] + [(key, value.get("name")) for key, value in ACHIEVEMENTS], 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=5000, required=False, widget=forms.Textarea(attrs={"maxlength": 5000}), ) is_rejected = forms.BooleanField(label="Размодерирвать", required=False) delete_account = forms.BooleanField( label="Удалить аккаунт и обнулить подписку", required=False) ping = forms.CharField( label="Отправить сообщение", max_length=5000, widget=forms.Textarea(), required=False, ) add_membership_days = forms.IntegerField(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=1024, widget=forms.Textarea(attrs={"maxlength": 1024}), ) contact = forms.CharField( label="Контакт для связи", required=True, max_length=256, ) company = forms.CharField(label="Компания", required=True, 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": 600, "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", "contact", "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( "Пользователь с таким ником уже существует. Выберите другой")