Açıklama Yok

forms.py 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. from django import forms
  2. from django.contrib.auth.models import User
  3. from api.models import Profile, Opportunity, IntroductionRequest
  4. from crispy_forms.helper import FormHelper
  5. from crispy_forms.layout import Layout, Field
  6. class CheckboxBeforeLabel(Field):
  7. template = "crispy/checkbox_before_label.html"
  8. class ProfileCreateForm(forms.Form):
  9. username = forms.CharField(label="Username")
  10. bio = forms.CharField(label="Bio", widget=forms.Textarea, required=False)
  11. interests = forms.CharField(label="Interests", required=False)
  12. industry = forms.CharField(label="Industry", required=False)
  13. is_verified = forms.BooleanField(label="Verified", required=False)
  14. tags = forms.CharField(label="Tags", required=False, help_text="Comma-separated")
  15. def __init__(self, *args, **kwargs):
  16. super().__init__(*args, **kwargs)
  17. self.helper = FormHelper()
  18. self.helper.form_tag = False
  19. self.helper.layout = Layout(
  20. Field("username"),
  21. Field("bio"),
  22. Field("interests"),
  23. Field("industry"),
  24. Field("tags"),
  25. CheckboxBeforeLabel("is_verified"),
  26. )
  27. def clean_username(self):
  28. username = self.cleaned_data["username"].strip()
  29. user = User.objects.filter(username=username).first()
  30. if not user:
  31. raise forms.ValidationError("User not found.")
  32. if Profile.objects.filter(user=user).exists():
  33. raise forms.ValidationError("Profile for this user already exists.")
  34. return username
  35. def save(self):
  36. username = self.cleaned_data["username"].strip()
  37. user = User.objects.get(username=username)
  38. profile = Profile.objects.create(
  39. user=user,
  40. bio=self.cleaned_data.get("bio", ""),
  41. interests=self.cleaned_data.get("interests", ""),
  42. industry=self.cleaned_data.get("industry", ""),
  43. is_verified=self.cleaned_data.get("is_verified", False),
  44. )
  45. tags = [t.strip() for t in self.cleaned_data.get("tags", "").split(",") if t.strip()]
  46. try:
  47. if tags:
  48. profile.tags.set(tags)
  49. except Exception:
  50. pass
  51. return profile
  52. class ProfileEditForm(forms.ModelForm):
  53. tags = forms.CharField(label="Tags", required=False, help_text="Comma-separated")
  54. class Meta:
  55. model = Profile
  56. fields = ["bio", "interests", "industry", "is_verified"]
  57. def __init__(self, *args, **kwargs):
  58. super().__init__(*args, **kwargs)
  59. self.helper = FormHelper()
  60. self.helper.form_tag = False
  61. self.helper.layout = Layout(
  62. Field("bio"),
  63. Field("interests"),
  64. Field("industry"),
  65. Field("tags"),
  66. CheckboxBeforeLabel("is_verified"),
  67. )
  68. if self.instance and getattr(self.instance, "pk", None):
  69. try:
  70. names = list(self.instance.tags.names())
  71. self.fields["tags"].initial = ", ".join(names)
  72. except Exception:
  73. self.fields["tags"].initial = ""
  74. def save(self, commit=True):
  75. profile = super().save(commit)
  76. tags = [t.strip() for t in self.cleaned_data.get("tags", "").split(",") if t.strip()]
  77. try:
  78. if commit and hasattr(profile, "tags"):
  79. profile.tags.set(tags)
  80. except Exception:
  81. pass
  82. return profile
  83. class OpportunityForm(forms.ModelForm):
  84. class Meta:
  85. model = Opportunity
  86. fields = ["title", "description"]
  87. def __init__(self, *args, **kwargs):
  88. super().__init__(*args, **kwargs)
  89. self.helper = FormHelper()
  90. self.helper.form_tag = False
  91. self.helper.layout = Layout(
  92. Field("title"),
  93. Field("description"),
  94. )
  95. class IntroRequestForm(forms.Form):
  96. from_username = forms.CharField(label="From Username")
  97. to_username = forms.CharField(label="To Username")
  98. message = forms.CharField(label="Message", widget=forms.Textarea)
  99. is_accepted = forms.BooleanField(label="Accepted", required=False)
  100. def __init__(self, *args, **kwargs):
  101. instance = kwargs.pop("instance", None)
  102. super().__init__(*args, **kwargs)
  103. self.instance = instance
  104. self.helper = FormHelper()
  105. self.helper.form_tag = False
  106. self.helper.layout = Layout(
  107. Field("from_username"),
  108. Field("to_username"),
  109. Field("message"),
  110. CheckboxBeforeLabel("is_accepted"),
  111. )
  112. if instance:
  113. self.fields["from_username"].initial = instance.from_user.username
  114. self.fields["to_username"].initial = instance.to_user.username
  115. self.fields["message"].initial = instance.message
  116. self.fields["is_accepted"].initial = instance.is_accepted
  117. def clean(self):
  118. cleaned = super().clean()
  119. from_username = cleaned.get("from_username", "").strip()
  120. to_username = cleaned.get("to_username", "").strip()
  121. if not from_username or not to_username:
  122. return cleaned
  123. from_user = User.objects.filter(username=from_username).first()
  124. to_user = User.objects.filter(username=to_username).first()
  125. if not from_user or not to_user:
  126. raise forms.ValidationError("Both users must exist.")
  127. if from_user == to_user:
  128. raise forms.ValidationError("From and To users must be different.")
  129. cleaned["from_user_obj"] = from_user
  130. cleaned["to_user_obj"] = to_user
  131. return cleaned
  132. def save(self, instance: IntroductionRequest | None = None):
  133. data = self.cleaned_data
  134. if instance is None:
  135. instance = IntroductionRequest()
  136. instance.from_user = data["from_user_obj"]
  137. instance.to_user = data["to_user_obj"]
  138. instance.message = data.get("message", "")
  139. instance.is_accepted = data.get("is_accepted", False)
  140. instance.save()
  141. return instance
  142. # Recycle Core forms moved to recycle_core/forms.py