forms.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. from django import forms
  2. from django.conf import settings
  3. from django.core.files import File
  4. from django.contrib.auth.forms import UserCreationForm
  5. from django_file_form.forms import UploadedFileField, FileFormMixin, CharField, MultipleUploadedFileField
  6. from django.contrib.auth.models import User
  7. from django.urls import reverse, reverse_lazy
  8. from django.forms import *
  9. from django.forms.widgets import HiddenInput
  10. from django.forms.models import inlineformset_factory
  11. # from django.views.generic.edit.FormMixin
  12. # from crispy_forms.layout.buttons import Submit, InputButton
  13. from crispy_forms.layout import *
  14. from crispy_forms.bootstrap import InlineField, InlineCheckboxes
  15. from crispy_forms.helper import FormHelper
  16. from captcha.fields import CaptchaField
  17. from tinymce.widgets import TinyMCE
  18. from newsletter.forms import *
  19. from newsletter.models import *
  20. from marktplatz.widgets import *
  21. from .models import *
  22. from .urls import *
  23. def extend_help_text( help_text, myList ):
  24. extended_text = help_text
  25. extended_text += " z.B. "
  26. for x in myList:
  27. extended_text += x[1] + ", "
  28. extended_text = extended_text[:-2]
  29. extended_text += "."
  30. return extended_text
  31. class GeneralFields(forms.Form):
  32. terms = forms.BooleanField(required=True, )
  33. def __init__(self, *args, **kwargs):
  34. super(GeneralFields, self).__init__(*args, **kwargs)
  35. drurl = reverse_lazy( 'pages-generic', kwargs= { 'page': 'DATENSCHUTZRICHTLINIE' } )
  36. tmurl = reverse_lazy( 'pages-generic', kwargs= { 'page': 'TEILNAHME' } )
  37. self.fields ['terms'].label = 'Ich akzeptiere die <a target="_blank" href="{}"> Datenschutzrichtlinie</a> sowie die <a target="_blank" href="{}"> Teilnahmebedingungen</a> und habe sie gelesen.'.format(drurl, tmurl)
  38. class textSearchForm(forms.Form):
  39. mywidget = forms.TextInput( attrs={'onfocus': "this.value=''", 'class' : "border-thin"} )
  40. searchText = forms.CharField ( label='', widget = mywidget, max_length = 2048, min_length=3, empty_value="Suche...", initial='Suche...' )
  41. def __init__(self, *args, **kwargs):
  42. super(textSearchForm, self).__init__(*args, **kwargs)
  43. self.helper = FormHelper()
  44. self.helper.form_tag = False
  45. self.helper.layout = Layout(
  46. Div(
  47. Div('searchText', css_class='col-sm-4 col-4'),
  48. Div(
  49. ButtonHolder(
  50. Submit('submit', 'Suche', css_class='border-thin mybtn')
  51. ),
  52. css_class='col-sm-2 col-2'),
  53. css_class='form-row row mab-search-bar'),
  54. )
  55. class searchAgentForm(forms.ModelForm):
  56. agent_layout = Layout()
  57. class Meta:
  58. model = SearchAgent
  59. fields = ('ort', 'email')
  60. def __init__(self,*args, **kwargs):
  61. super().__init__(*args, **kwargs)
  62. # self.fields['ort'].widget = CheckboxSelectMultiple( attrs= { 'style' : "min-height: 250px;"} )
  63. self.agent_layout = Layout(
  64. Fieldset(
  65. ('Suchagent einrichten'),
  66. # 'ort',
  67. Div(
  68. Div(
  69. HTML("""
  70. <br>
  71. <button onclick=" ganz_wien()" class="btn btn-primary border-thin border-dark mybtn">Ganz Wien</button>
  72. <script>
  73. function ganz_wien(){
  74. $(".checkbox-ort .custom-control-label:contains('Wien')").each(function() {
  75. $this = $(this);
  76. var selector = "#" + $this.attr('for') ;
  77. $( selector ).prop('checked', true);
  78. });
  79. }
  80. </script>
  81. <br><br>
  82. """),
  83. css_class='col-sm-6 col-6'),
  84. css_class='form-row row'),
  85. Div(
  86. Div(
  87. InlineCheckboxes('ort'),
  88. css_class='col-sm-8 col-8 checkbox-ort'
  89. ),
  90. css_class='form-row row'),
  91. ),
  92. )
  93. class AgentNewslwtterForm( searchAgentForm, GeneralFields):
  94. email_field = forms.EmailField( label = 'Email', help_text="Du kannst den Suchagenten und den Newsletter jederzeit abbestellen - über einen Link in den Mails.", required=True, max_length=254 )
  95. subscribe = forms.BooleanField( label = 'Newsletter abonnieren', help_text='', required = False )
  96. captcha = CaptchaField( label = 'Bitte lösen Sie die Gleichung', generator='captcha.helpers.math_challenge' )
  97. def __init__(self, *args, **kwargs):
  98. # super(searchAgentForm, self).__init__(*args, **kwargs)
  99. super(AgentNewslwtterForm, self).__init__(*args, **kwargs)
  100. self.helper = FormHelper(self)
  101. self.helper.attrs = { 'enctype' : "multipart/form-data" }
  102. self.helper.form_action = reverse('agent-newsletter-create', kwargs={'newsletter_slug': "gemeinschaffen-newsletter"} )
  103. self.helper.layout = Layout(
  104. self.agent_layout,
  105. 'email_field',
  106. 'subscribe',
  107. 'terms',
  108. 'captcha',
  109. ButtonHolder(
  110. Submit('submit', 'Suchagent aktivieren', css_class='border-thin border-dark mybtn')
  111. ),
  112. )
  113. class NewsletterForm(SubscribeRequestForm, GeneralFields):
  114. class Meta:
  115. model = SubscribeRequestForm.Meta.model
  116. fields = SubscribeRequestForm.Meta.fields + (
  117. 'terms', )
  118. def __init__(self,*args, **kwargs):
  119. super(SubscribeRequestForm, self).__init__(*args, **kwargs)
  120. self.helper = FormHelper()
  121. self.helper.form_tag = False
  122. self.layout = Layout(
  123. Fieldset(
  124. ('Anmelden'),
  125. 'name_field',
  126. 'email_field',
  127. 'terms',
  128. Div(
  129. ButtonHolder(
  130. Submit('submit', 'Anmelden', css_class='border-thin mybtn')
  131. ),
  132. ),
  133. Div(HTML("&nbsp;") ),
  134. ),
  135. )
  136. self.helper.layout = self.layout
  137. class RegisterForm(forms.ModelForm, GeneralFields):
  138. class Meta:
  139. model = Contact
  140. fields = ('first_name','last_name','email','adress','postcode','city','country',
  141. 'phonenumber','alternate_phonenumber','skype_name','website', 'terms')
  142. class SignUpForm(UserCreationForm):
  143. captcha = CaptchaField( generator='captcha.helpers.math_challenge' )
  144. class Meta:
  145. model = User
  146. fields = ('username', 'password1', 'password2')
  147. #
  148. # CREATE
  149. #
  150. class ProductForm(forms.ModelForm, GeneralFields):
  151. class Meta:
  152. model = Product
  153. type = 'BASE'
  154. fields = ( 'terms', 'name','claim','beschreibung','learning','gruendungsjahr','betriebgenommen','status',
  155. 'adresse', 'adresse_zusatz', 'plz', 'website','email','frei','kfrei','ort','rechtsform','orga','realitylab',
  156. 'edit','public','type', )
  157. def __init__(self, *args, **kwargs):
  158. super(ProductForm, self).__init__(*args, **kwargs)
  159. self.fields['orga'].widget = ListTextWidget(data_list=Product.ORGANIZATION, name='orga_list')
  160. self.fields['rechtsform'].widget = ListTextWidget(data_list=Product.RECHTSFORM, name='rechtsform_list')
  161. self.fields['beschreibung'].widget = TinyMCE(attrs={'cols': 80, 'rows': 30})
  162. self.fields['learning'].widget = TinyMCE(attrs={'cols': 80, 'rows': 30})
  163. self.fields['edit'].widget = HiddenInput()
  164. self.fields['public'].widget = HiddenInput()
  165. self.fields['type'].widget = HiddenInput()
  166. self.fields['type'].initial = 'BASE'
  167. #
  168. # extend_help_text
  169. #
  170. self.fields['orga'].help_text = extend_help_text (self.fields['orga'].help_text, Product.ORGANIZATION)
  171. self.fields['rechtsform'].help_text = extend_help_text (self.fields['rechtsform'].help_text, Product.RECHTSFORM)
  172. #
  173. # FORM HELPER
  174. #
  175. if 'instance' in kwargs:
  176. if kwargs['instance'] is not None:
  177. self.redirect_to_pics = reverse_lazy( 'projekt-bearbeiten-submit-pics', kwargs= { 'type': self.Meta.type, 'pk': kwargs['instance'].id } )
  178. self.redirect_to_publish = reverse_lazy( 'projekt-bearbeiten-publish', kwargs= { 'type': self.Meta.type, 'pk': kwargs['instance'].id } )
  179. else:
  180. self.redirect_to_pics = reverse_lazy( 'neues-projekt-submit-pics', kwargs = { 'type': self.Meta.type } )
  181. self.redirect_to_publish = reverse_lazy( 'neues-projekt-publish', kwargs = { 'type': self.Meta.type } )
  182. self.helper = FormHelper( )
  183. self.helper.attrs = {'id': 'upload_mab', 'enctype': 'multipart/form-dat' }
  184. # self.helper.form_tag = True
  185. self.product_layout = Layout(
  186. Fieldset(
  187. ('Über dein Projekt'),
  188. 'name','claim','beschreibung',
  189. Div(
  190. Div('frei', css_class='col-sm-6 col-6 '),
  191. Div('kfrei', css_class='col-sm-6 col-6 ' ),
  192. css_class='form-row row mab-field-highlight'),
  193. 'learning','status',
  194. Div(
  195. Div('adresse', css_class='col-sm-6 col-6'),
  196. Div('adresse_zusatz', css_class='col-sm-6 col-6'),
  197. css_class='form-row row'),
  198. Div(
  199. Div('plz', css_class='col-sm-6 col-6'),
  200. Div('ort', css_class='col-sm-6 col-6'),
  201. css_class='form-row row'),
  202. 'rechtsform','orga',
  203. Div(
  204. Div('website', css_class='col-sm-6 col-6'),
  205. Div('email', css_class='col-sm-6 col-6'),
  206. css_class='form-row row'),
  207. Div(
  208. Div('gruendungsjahr', css_class='col-sm-6 col-6'),
  209. Div('betriebgenommen', css_class='col-sm-6 col-6'),
  210. css_class='form-row row'),
  211. 'edit','public', 'realitylab', 'type',
  212. ),
  213. )
  214. self.submit_layout = Layout(
  215. 'terms',
  216. HTML("<br>"),
  217. Div(
  218. Div(
  219. ButtonHolder(
  220. Submit('submit', 'Speichern',
  221. css_class='border-thin mybtn')
  222. ),
  223. css_class='col-sm-4 col-4'),
  224. Div(
  225. ButtonHolder(
  226. Submit('submit', 'Speichern & Bilder hochladen',
  227. onclick='this.form.action="{}";'.format( self.redirect_to_pics ),
  228. css_class='border-thin mybtn')
  229. ),
  230. css_class='col-sm-4 col-4'),
  231. Div(
  232. ButtonHolder(
  233. Submit('submit', 'Speichern und Freischaltung Anfragen',
  234. onclick='this.form.action="{}";'.format( self.redirect_to_publish ),
  235. css_class='border-thin mybtn'
  236. ),
  237. HTML("<br><p>Dein Projekt ist noch nicht für jede Person sichtbar, damit wir dein Projekt freischalten, klicke auf diesen Button.</p>")
  238. ),
  239. css_class='col-sm-4 col-4'),
  240. css_class='form-row row'),
  241. )
  242. self.helper.layout = Layout(
  243. self.product_layout,
  244. self.submit_layout,
  245. )
  246. class MobilitaetsForm(ProductForm):
  247. class Meta():
  248. model = MobilitaetsProjekt
  249. type = 'MOBI'
  250. fields = ProductForm.Meta.fields + ( )
  251. def __init__(self,*args, **kwargs):
  252. super(MobilitaetsForm, self).__init__(*args, **kwargs)
  253. self.fields['type'].initial = 'MOBI'
  254. class ErnaehrungsForm(ProductForm):
  255. class Meta():
  256. model = ErnaehrungsProjekt
  257. type = 'ERNA'
  258. fields = ProductForm.Meta.fields + ( )
  259. def __init__(self,*args, **kwargs):
  260. super(ErnaehrungsForm, self).__init__(*args, **kwargs)
  261. self.fields['type'].initial = 'ERNA'
  262. class EnergyForm(ProductForm):
  263. class Meta():
  264. model = EnergyProjekt
  265. type = 'ENER'
  266. fields = ProductForm.Meta.fields + ( )
  267. def __init__(self,*args, **kwargs):
  268. super(EnergyForm, self).__init__(*args, **kwargs)
  269. self.fields['type'].initial = 'ENER'
  270. class WohnprojektForm(ProductForm):
  271. class Meta:
  272. model = Wohnprojekt
  273. type = 'WOHN'
  274. fields = ProductForm.Meta.fields + (
  275. 'eigentum', 'inseratstext', 'altneu', 'schwerpunkt', 'wohnbaufoerderung', 'artmodell', 'bautraeger', 'architektur', 'aerwachsene', 'akinder', 'awohnungen', 'wohnflaeche', 'gewerbeflaechen', 'gemeinschaftsflaeche', 'sonstige_flaechen', 'flaeche', 'kflaechen', 'gemeinschaftr', 'kgemeinschaftr', 'gewerbe', 'sonderwohnformen', 'raumangebot', 'kraumangebot', 'parbeiten', 'karbeiten', 'bauweise', 'zielgruppen', 'gprojekte', 'oekologie', 'freiraumangebote', 'gaestwohnungen', 'urbanem',
  276. )
  277. def __init__(self,*args, **kwargs):
  278. super(WohnprojektForm, self).__init__(*args, **kwargs)
  279. #
  280. #
  281. self.fields['artmodell'].widget = ListTextWidget(data_list=Wohnprojekt.ARTMODELL, name='artmodell_list')
  282. self.fields['bautraeger'].widget = ListTextWidget(data_list=Wohnprojekt.BAUTRAEGER, name='bautraeger_list')
  283. self.fields['bauweise'].widget = ListTextWidget(data_list=Wohnprojekt.BAUWEISE, name='bauweise_list')
  284. self.fields['zielgruppen'].widget = ListTextWidget(data_list=Wohnprojekt.ZIELGRUPPEN, name='zielgruppen_list')
  285. self.fields['gprojekte'].widget = ListTextWidget(data_list=Wohnprojekt.GPROJEKTE, name='gprojekte_list')
  286. self.fields['freiraumangebote'].widget = ListTextWidget(data_list=Wohnprojekt.FREIANGEBOT, name='freiraumangebote_list')
  287. # self.fields['gewerbe'].widget = ListTextWidget(data_list=Wohnprojekt.GEWERBE, name='gewerbe_list')
  288. #
  289. #
  290. self.fields['bauweise'].help_text = extend_help_text (self.fields['bauweise'].help_text, Wohnprojekt.BAUWEISE)
  291. self.fields['zielgruppen'].help_text = extend_help_text (self.fields['zielgruppen'].help_text, Wohnprojekt.ZIELGRUPPEN)
  292. self.fields['gprojekte'].help_text = extend_help_text (self.fields['gprojekte'].help_text, Wohnprojekt.GPROJEKTE)
  293. #
  294. #
  295. self.fields['frei'].label = "Wohnung Frei"
  296. self.fields['inseratstext'].label = "Inseratstext für Raumangebote"
  297. #
  298. #
  299. self.fields['type'].initial = 'WOHN'
  300. #
  301. # self.helper = FormHelper()
  302. # self.helper.form_tag = False
  303. self.helper.layout = Layout(
  304. self.product_layout,
  305. Fieldset( 'Wohnprojekt',
  306. 'eigentum',
  307. 'artmodell',
  308. 'altneu',
  309. 'schwerpunkt',
  310. 'wohnbaufoerderung',
  311. 'bautraeger',
  312. 'architektur',
  313. Div(
  314. Div('aerwachsene', css_class='col-sm-6 col-6'),
  315. Div('akinder', css_class='col-sm-6 col-6'),
  316. css_class='form-row row'),
  317. 'awohnungen',
  318. 'gaestwohnungen',
  319. Fieldset ( 'Flächen',
  320. Div(
  321. Div('wohnflaeche', css_class='col-sm-3 col-3'),
  322. Div('gewerbeflaechen', css_class='col-sm-3 col-3'),
  323. Div('gemeinschaftsflaeche', css_class='col-sm-3 col-3'),
  324. Div('sonstige_flaechen', css_class='col-sm-3 col-3'),
  325. css_class='form-row row'),
  326. 'flaeche',
  327. 'kflaechen',
  328. ),
  329. Div(
  330. Div('gemeinschaftr', css_class='col-sm-6 col-6'),
  331. Div('raumangebot', css_class='col-sm-6 col-6'),
  332. Div('kgemeinschaftr', css_class='col-sm-6 col-6'),
  333. Div('kraumangebot', css_class='col-sm-6 col-6'),
  334. css_class='form-row row'),
  335. 'gewerbe',
  336. Div('inseratstext', css_class = "mab-field-highlight"),
  337. 'sonderwohnformen',
  338. Div(
  339. Div('parbeiten', css_class='col-sm-6 col-6'),
  340. Div('karbeiten', css_class='col-sm-6 col-6'),
  341. css_class='form-row row'),
  342. 'bauweise', 'zielgruppen', 'gprojekte', 'oekologie', 'freiraumangebote', 'urbanem',
  343. ),
  344. self.submit_layout,
  345. )
  346. #
  347. # UPDATE
  348. #
  349. class MediaForm(FileFormMixin, forms.Form):
  350. image = UploadedFileField()
  351. name_for = forms.CharField()
  352. copyright = forms.CharField()
  353. #prefix = 'upload'
  354. def __init__(self, *args, **kwargs):
  355. super(MediaForm, self).__init__(*args, **kwargs)
  356. self.helper = FormHelper()
  357. self.helper.form_tag = False
  358. self.fields['name_for'].label = 'Bildbeschriftung'
  359. self.fields['copyright'].label = 'Urheberrechte'
  360. self.fields['image'].label = 'Bild oder Video'
  361. self.fields['image'].help_text = 'Bitte laden Sie Bilder im PNG- oder JPEG-Format hoch. Laden Sie Videos im MP4-Format hoch.'
  362. self.layout = Layout(
  363. Fieldset(
  364. (''),
  365. Div(
  366. Div('name_for', css_class='form-group col-md-6 mb-0'),
  367. Div('copyright', css_class='form-group col-md-4 mb-0')
  368. , css_class='form-row'),
  369. Div(
  370. Div('image', css_class='form-group col-md-6 mb-0'),
  371. css_class='form-row'),
  372. ))