2 from django
import forms
3 from django
.conf
import settings
6 from datetime
import datetime
8 from iwdb
.words
.models
import Word
, ChangeSheet
, LanguageChoices
9 from iwdb
.words
.models
import Pronunciation
, POLChoices
, Meaning
10 from iwdb
.utils
import no_new_lines
14 class BaseAjaxForm(forms
.Form
):
15 def __init__(self
, request
, *args
, **kw
):
16 self
.request
= request
17 super(BaseAjaxForm
, self
).__init
__(*args
, **kw
)
20 # BaseWordAjaxForm # {{{
21 class BaseWordAjaxForm(BaseAjaxForm
):
22 word
= forms
.CharField(max_length
=100)
25 word
= self
.cleaned_data
["word"]
27 word
= Word
.objects
.get(word
=word
)
28 except Word
.DoesNotExist
:
30 word
= Word
.objects
.get(pk
=word
)
31 except Word
.DoesNotExist
:
32 raise forms
.ValidationError("word does not exists")
33 except Word
.MultipleObjectsReturned
:
34 raise forms
.ValidationError("MultipleObjectsReturned")
38 # TwoWordAjaxForm # {{{
39 class TwoWordAjaxForm(BaseWordAjaxForm
):
40 other_word
= forms
.CharField(max_length
=100)
42 def clean_other_word(self
):
43 word
= self
.cleaned_data
["other_word"]
45 word
= Word
.objects
.get(word
=word
)
46 except Word
.DoesNotExist
:
48 word
= Word
.objects
.get(pk
=word
)
49 except Word
.DoesNotExist
:
50 raise forms
.ValidationError("word does not exists")
51 except Word
.MultipleObjectsReturned
:
52 raise forms
.ValidationError("MultipleObjectsReturned")
56 # AlterM2MRelationForm # {{{
57 class AlterM2MRelationForm(TwoWordAjaxForm
):
58 url_re
= re
.compile("/w/ajax/word/(?P<operation>.*)-(?P<relation>.*)/")
60 d
= self
.cleaned_data
.get
61 if not d("word") or not d("other_word"):
62 return self
.cleaned_data
63 operation
, relation
= AlterM2MRelationForm
.url_re
.match(
66 relation_name
= relation
if relation
.endswith("s") else relation
+ "s"
67 changesheet_type
= "%s-added" if operation
== "add" else "%s-removed"
68 self
.changesheet_type
= changesheet_type
% relation
69 self
.operation
= operation
70 self
.relation_name
= relation_name
72 if relation
== "translation":
73 if d("word").language
== d("other_word").language
:
74 raise forms
.ValidationError(
75 "translation in same language not supported"
78 if d("word").language
!= d("other_word").language
:
79 raise forms
.ValidationError(
80 "both words are not in same language"
82 return self
.cleaned_data
85 d
= self
.cleaned_data
.get
87 getattr(d("word"), self
.relation_name
), self
.operation
89 ChangeSheet
.objects
.create(
91 user
= self
.request
.user
,
92 id_1
= d("other_word").id,
93 type = self
.changesheet_type
,
96 unicode(word
) for word
in getattr(
97 d("word"), self
.relation_name
102 # ChangeLanguageForm # {{{
103 class ChangeLanguageForm(BaseWordAjaxForm
):
104 language
= forms
.ChoiceField(choices
=LanguageChoices
)
106 d
= self
.cleaned_data
.get
107 ChangeSheet
.objects
.create(
109 user
= self
.request
.user
,
110 data
= d("word").language
, # old language gets logged.
111 type = "language-changed",
113 d("word").language
= d("language")
115 return d("word").language
118 # UpdateEtymologyForm # {{{
119 class UpdateEtymologyForm(BaseWordAjaxForm
):
120 etymology
= forms
.CharField()
122 d
= self
.cleaned_data
.get
123 ChangeSheet
.objects
.create(
125 user
= self
.request
.user
,
126 data
= d("word").etymology
, # old etymology gets logged.
127 type = "etymology-updated",
129 d("word").etymology
= d("etymology")
131 return d("word").etymology
134 # AddPronunciation # {{{
135 class AddPronunciation(BaseWordAjaxForm
):
136 spelling
= forms
.CharField(max_length
=100)
137 key
= forms
.CharField(max_length
=100)
139 def clean_spelling(self
):
140 d
= self
.cleaned_data
.get
141 if d("spelling") not in d("word").forms
:
142 raise forms
.ValidationError(
143 "this spelling not allowed for this word"
148 d
= self
.cleaned_data
.get
149 p
, c
= Pronunciation
.objects
.get_or_create(
150 spelling
=d("spelling"), pronunciation_key
=d("key")
155 ChangeSheet
.objects
.create(
157 user
= self
.request
.user
,
159 type = "pronunciation-added",
163 # RemovePronunciation # {{{
164 class RemovePronunciation(BaseWordAjaxForm
):
165 pronunciation
= forms
.CharField(max_length
=100)
167 def clean_pronunciation(self
):
168 d
= self
.cleaned_data
.get
170 pronunciation
= Pronunciation
.objects
.get(pk
=d("pronunciation"))
171 except Pronunciation
.DoesNotExist
:
172 raise forms
.ValidationError("No such pronunciation")
173 if pronunciation
.spelling
not in d("word").forms
:
174 raise forms
.ValidationError(
175 "pronunciation not used for this word"
180 d
= self
.cleaned_data
.get
181 p
= d("pronunciation")
183 p
.deleted_on
= datetime
.now()
185 ChangeSheet
.objects
.create(
187 user
= self
.request
.user
,
189 type = "pronunciation-removed",
193 # EditPronunciation # {{{
194 class EditPronunciation(BaseWordAjaxForm
):
195 pronunciation
= forms
.CharField(max_length
=100)
196 key
= forms
.CharField(max_length
=100)
198 def clean_pronunciation(self
):
199 d
= self
.cleaned_data
.get
201 pronunciation
= Pronunciation
.objects
.get(pk
=d("pronunciation"))
202 except Pronunciation
.DoesNotExist
:
203 raise forms
.ValidationError("No such pronunciation")
204 if pronunciation
.spelling
not in d("word").forms
:
205 raise forms
.ValidationError(
206 "pronunciation not used for this word"
211 d
= self
.cleaned_data
.get
212 p
= d("pronunciation")
213 ChangeSheet
.objects
.create(
215 user
= self
.request
.user
,
217 data
= p
.pronunciation_key
, # old key
218 type = "pronunciation-edited",
220 p
.pronunciation_key
= d("key")
225 class AddMeaning(BaseWordAjaxForm
):
226 m
= forms
.CharField()
227 usage
= forms
.CharField(required
=False)
228 pol
= forms
.ChoiceField(choices
=POLChoices
)
229 language
= forms
.ChoiceField(choices
=LanguageChoices
)
231 clean_m
= no_new_lines("m")
232 clean_usage
= no_new_lines("usage")
235 d
= self
.cleaned_data
.get
236 meaning
= Meaning
.objects
.create(
237 word
= d("word"), meaning
= d("m"), usage
= d("usage"),
238 pol
= d("pol"), language
= d("language"),
240 ChangeSheet
.objects
.create(
242 user
= self
.request
.user
,
244 type = "meaning-added",
248 # RemoveMeaning # {{{
249 class RemoveMeaning(BaseWordAjaxForm
):
250 meaning
= forms
.CharField(max_length
=100)
252 def clean_meaning(self
):
253 d
= self
.cleaned_data
.get
255 meaning
= Meaning
.objects
.get(pk
=d("meaning"))
256 except Meaning
.DoesNotExist
:
257 raise forms
.ValidationError("No such meaning")
258 if meaning
.word
!= d("word"):
259 raise forms
.ValidationError(
260 "meaning not used for this word"
265 d
= self
.cleaned_data
.get
266 meaning
= d("meaning")
267 meaning
.is_deleted
= True
268 meaning
.deleted_on
= datetime
.now()
270 ChangeSheet
.objects
.create(
272 user
= self
.request
.user
,
274 type = "meaning-removed",
278 # UpdateMeaning # {{{
279 class UpdateMeaning(AddMeaning
, RemoveMeaning
):
281 d
= self
.cleaned_data
.get
282 meaning
= d("meaning")
285 "meaning: %s" % meaning
.meaning
,
286 "usage: %s" % meaning
.usage
,
287 "pol: %s" % meaning
.pol
,
288 "language: %s" % meaning
.language
,
291 meaning
.meaning
= d("m")
292 meaning
.usage
= d("usage")
293 meaning
.pol
= d("pol")
294 meaning
.language
= d("language")
296 ChangeSheet
.objects
.create(
298 user
= self
.request
.user
,
301 type = "meaning-updated",
306 class AddWordForm(BaseWordAjaxForm
):
307 form
= forms
.CharField()
309 def clean_form(self
):
310 # form same as word can not be added/deleted
311 d
= self
.cleaned_data
.get
312 if d("form").lower() == d("word").word
.lower():
313 raise forms
.ValidationError("not allowed")
314 return d("form").lower()
317 d
= self
.cleaned_data
.get
318 ChangeSheet
.objects
.create(
320 user
= self
.request
.user
,
321 data
= d("word").forms
, # old forms
325 settings
.WORD_FORM_DELIMITER
, d("form"),
326 settings
.WORD_FORM_DELIMITER
327 ) not in d("word").forms
:
328 d("word").forms
+= d("form")+settings
.WORD_FORM_DELIMITER
330 return d("word").forms
.split(settings
.WORD_FORM_DELIMITER
)
333 # RemoveWordForm # {{{
334 class RemoveWordForm(BaseWordAjaxForm
):
335 form
= forms
.CharField()
337 def clean_form(self
):
338 # form same as word can not be added/deleted
339 d
= self
.cleaned_data
.get
340 if d("form").lower() == d("word").word
.lower():
341 raise forms
.ValidationError("not allowed")
343 settings
.WORD_FORM_DELIMITER
, d("form"),
344 settings
.WORD_FORM_DELIMITER
345 ) not in d("word").forms
:
346 raise forms
.ValidationError("form is not associated with word")
347 return d("form").lower()
350 d
= self
.cleaned_data
.get
351 ChangeSheet
.objects
.create(
353 user
= self
.request
.user
,
354 data
= d("form"), # form that is being removed
355 type = "form-removed",
357 forms
= d("word").forms
.split(settings
.WORD_FORM_DELIMITER
)
358 forms
.remove(d("form"))
359 d("word").forms
= settings
.WORD_FORM_DELIMITER
.join(forms
)
365 class AddWord(BaseAjaxForm
):
366 word
= forms
.CharField(max_length
=100)
368 def clean_word(self
):
369 d
= self
.cleaned_data
.get
370 if settings
.WORD_FORM_DELIMITER
in d("word"):
371 raise forms
.ValidationError(
372 "%s not allowed" % settings
.WORD_FORM_DELIMITER
374 # what if someone tries to add a word that is already a form
375 # of another word? this cant be because they ll go to that forms
376 # page and they ll be redirected to the original word, they wud just
377 # not see the add button for that word.
381 d
= self
.cleaned_data
.get
382 word
= Word
.objects
.create(
383 word
=d("word"), forms
="%s%s%s" % (
384 settings
.WORD_FORM_DELIMITER
, wordname
,
385 settings
.WORD_FORM_DELIMITER
388 ChangeSheet
.objects
.create(
390 user
= self
.request
.user
,