localflavor.py 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055
  1. # -*- coding: utf-8 -*-
  2. # Tests for the different contrib/localflavor/ form fields.
  3. localflavor_tests = r"""
  4. # USZipCodeField ##############################################################
  5. USZipCodeField validates that the data is either a five-digit U.S. zip code or
  6. a zip+4.
  7. >>> from django.contrib.localflavor.us.forms import USZipCodeField
  8. >>> f = USZipCodeField()
  9. >>> f.clean('60606')
  10. u'60606'
  11. >>> f.clean(60606)
  12. u'60606'
  13. >>> f.clean('04000')
  14. u'04000'
  15. >>> f.clean('4000')
  16. Traceback (most recent call last):
  17. ...
  18. ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
  19. >>> f.clean('60606-1234')
  20. u'60606-1234'
  21. >>> f.clean('6060-1234')
  22. Traceback (most recent call last):
  23. ...
  24. ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
  25. >>> f.clean('60606-')
  26. Traceback (most recent call last):
  27. ...
  28. ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
  29. >>> f.clean(None)
  30. Traceback (most recent call last):
  31. ...
  32. ValidationError: [u'This field is required.']
  33. >>> f.clean('')
  34. Traceback (most recent call last):
  35. ...
  36. ValidationError: [u'This field is required.']
  37. >>> f = USZipCodeField(required=False)
  38. >>> f.clean('60606')
  39. u'60606'
  40. >>> f.clean(60606)
  41. u'60606'
  42. >>> f.clean('04000')
  43. u'04000'
  44. >>> f.clean('4000')
  45. Traceback (most recent call last):
  46. ...
  47. ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
  48. >>> f.clean('60606-1234')
  49. u'60606-1234'
  50. >>> f.clean('6060-1234')
  51. Traceback (most recent call last):
  52. ...
  53. ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
  54. >>> f.clean('60606-')
  55. Traceback (most recent call last):
  56. ...
  57. ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
  58. >>> f.clean(None)
  59. u''
  60. >>> f.clean('')
  61. u''
  62. # USPhoneNumberField ##########################################################
  63. USPhoneNumberField validates that the data is a valid U.S. phone number,
  64. including the area code. It's normalized to XXX-XXX-XXXX format.
  65. >>> from django.contrib.localflavor.us.forms import USPhoneNumberField
  66. >>> f = USPhoneNumberField()
  67. >>> f.clean('312-555-1212')
  68. u'312-555-1212'
  69. >>> f.clean('3125551212')
  70. u'312-555-1212'
  71. >>> f.clean('312 555-1212')
  72. u'312-555-1212'
  73. >>> f.clean('(312) 555-1212')
  74. u'312-555-1212'
  75. >>> f.clean('312 555 1212')
  76. u'312-555-1212'
  77. >>> f.clean('312.555.1212')
  78. u'312-555-1212'
  79. >>> f.clean('312.555-1212')
  80. u'312-555-1212'
  81. >>> f.clean(' (312) 555.1212 ')
  82. u'312-555-1212'
  83. >>> f.clean('555-1212')
  84. Traceback (most recent call last):
  85. ...
  86. ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
  87. >>> f.clean('312-55-1212')
  88. Traceback (most recent call last):
  89. ...
  90. ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
  91. >>> f.clean(None)
  92. Traceback (most recent call last):
  93. ...
  94. ValidationError: [u'This field is required.']
  95. >>> f.clean('')
  96. Traceback (most recent call last):
  97. ...
  98. ValidationError: [u'This field is required.']
  99. >>> f = USPhoneNumberField(required=False)
  100. >>> f.clean('312-555-1212')
  101. u'312-555-1212'
  102. >>> f.clean('3125551212')
  103. u'312-555-1212'
  104. >>> f.clean('312 555-1212')
  105. u'312-555-1212'
  106. >>> f.clean('(312) 555-1212')
  107. u'312-555-1212'
  108. >>> f.clean('312 555 1212')
  109. u'312-555-1212'
  110. >>> f.clean('312.555.1212')
  111. u'312-555-1212'
  112. >>> f.clean('312.555-1212')
  113. u'312-555-1212'
  114. >>> f.clean(' (312) 555.1212 ')
  115. u'312-555-1212'
  116. >>> f.clean('555-1212')
  117. Traceback (most recent call last):
  118. ...
  119. ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
  120. >>> f.clean('312-55-1212')
  121. Traceback (most recent call last):
  122. ...
  123. ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
  124. >>> f.clean(None)
  125. u''
  126. >>> f.clean('')
  127. u''
  128. # USStateField ################################################################
  129. USStateField validates that the data is either an abbreviation or name of a
  130. U.S. state.
  131. >>> from django.contrib.localflavor.us.forms import USStateField
  132. >>> f = USStateField()
  133. >>> f.clean('il')
  134. u'IL'
  135. >>> f.clean('IL')
  136. u'IL'
  137. >>> f.clean('illinois')
  138. u'IL'
  139. >>> f.clean(' illinois ')
  140. u'IL'
  141. >>> f.clean(60606)
  142. Traceback (most recent call last):
  143. ...
  144. ValidationError: [u'Enter a U.S. state or territory.']
  145. >>> f.clean(None)
  146. Traceback (most recent call last):
  147. ...
  148. ValidationError: [u'This field is required.']
  149. >>> f.clean('')
  150. Traceback (most recent call last):
  151. ...
  152. ValidationError: [u'This field is required.']
  153. >>> f = USStateField(required=False)
  154. >>> f.clean('il')
  155. u'IL'
  156. >>> f.clean('IL')
  157. u'IL'
  158. >>> f.clean('illinois')
  159. u'IL'
  160. >>> f.clean(' illinois ')
  161. u'IL'
  162. >>> f.clean(60606)
  163. Traceback (most recent call last):
  164. ...
  165. ValidationError: [u'Enter a U.S. state or territory.']
  166. >>> f.clean(None)
  167. u''
  168. >>> f.clean('')
  169. u''
  170. # USStateSelect ###############################################################
  171. USStateSelect is a Select widget that uses a list of U.S. states/territories
  172. as its choices.
  173. >>> from django.contrib.localflavor.us.forms import USStateSelect
  174. >>> w = USStateSelect()
  175. >>> print w.render('state', 'IL')
  176. <select name="state">
  177. <option value="AL">Alabama</option>
  178. <option value="AK">Alaska</option>
  179. <option value="AS">American Samoa</option>
  180. <option value="AZ">Arizona</option>
  181. <option value="AR">Arkansas</option>
  182. <option value="CA">California</option>
  183. <option value="CO">Colorado</option>
  184. <option value="CT">Connecticut</option>
  185. <option value="DE">Delaware</option>
  186. <option value="DC">District of Columbia</option>
  187. <option value="FM">Federated States of Micronesia</option>
  188. <option value="FL">Florida</option>
  189. <option value="GA">Georgia</option>
  190. <option value="GU">Guam</option>
  191. <option value="HI">Hawaii</option>
  192. <option value="ID">Idaho</option>
  193. <option value="IL" selected="selected">Illinois</option>
  194. <option value="IN">Indiana</option>
  195. <option value="IA">Iowa</option>
  196. <option value="KS">Kansas</option>
  197. <option value="KY">Kentucky</option>
  198. <option value="LA">Louisiana</option>
  199. <option value="ME">Maine</option>
  200. <option value="MH">Marshall Islands</option>
  201. <option value="MD">Maryland</option>
  202. <option value="MA">Massachusetts</option>
  203. <option value="MI">Michigan</option>
  204. <option value="MN">Minnesota</option>
  205. <option value="MS">Mississippi</option>
  206. <option value="MO">Missouri</option>
  207. <option value="MT">Montana</option>
  208. <option value="NE">Nebraska</option>
  209. <option value="NV">Nevada</option>
  210. <option value="NH">New Hampshire</option>
  211. <option value="NJ">New Jersey</option>
  212. <option value="NM">New Mexico</option>
  213. <option value="NY">New York</option>
  214. <option value="NC">North Carolina</option>
  215. <option value="ND">North Dakota</option>
  216. <option value="MP">Northern Mariana Islands</option>
  217. <option value="OH">Ohio</option>
  218. <option value="OK">Oklahoma</option>
  219. <option value="OR">Oregon</option>
  220. <option value="PW">Palau</option>
  221. <option value="PA">Pennsylvania</option>
  222. <option value="PR">Puerto Rico</option>
  223. <option value="RI">Rhode Island</option>
  224. <option value="SC">South Carolina</option>
  225. <option value="SD">South Dakota</option>
  226. <option value="TN">Tennessee</option>
  227. <option value="TX">Texas</option>
  228. <option value="UT">Utah</option>
  229. <option value="VT">Vermont</option>
  230. <option value="VI">Virgin Islands</option>
  231. <option value="VA">Virginia</option>
  232. <option value="WA">Washington</option>
  233. <option value="WV">West Virginia</option>
  234. <option value="WI">Wisconsin</option>
  235. <option value="WY">Wyoming</option>
  236. </select>
  237. # USSocialSecurityNumberField #################################################
  238. >>> from django.contrib.localflavor.us.forms import USSocialSecurityNumberField
  239. >>> f = USSocialSecurityNumberField()
  240. >>> f.clean('987-65-4330')
  241. u'987-65-4330'
  242. >>> f.clean('987654330')
  243. u'987-65-4330'
  244. >>> f.clean('078-05-1120')
  245. Traceback (most recent call last):
  246. ...
  247. ValidationError: [u'Enter a valid U.S. Social Security number in XXX-XX-XXXX format.']
  248. # UKPostcodeField #############################################################
  249. UKPostcodeField validates that the data is a valid UK postcode.
  250. >>> from django.contrib.localflavor.uk.forms import UKPostcodeField
  251. >>> f = UKPostcodeField()
  252. >>> f.clean('BT32 4PX')
  253. u'BT32 4PX'
  254. >>> f.clean('GIR 0AA')
  255. u'GIR 0AA'
  256. >>> f.clean('BT324PX')
  257. Traceback (most recent call last):
  258. ...
  259. ValidationError: [u'Enter a postcode. A space is required between the two postcode parts.']
  260. >>> f.clean('1NV 4L1D')
  261. Traceback (most recent call last):
  262. ...
  263. ValidationError: [u'Enter a postcode. A space is required between the two postcode parts.']
  264. >>> f.clean(None)
  265. Traceback (most recent call last):
  266. ...
  267. ValidationError: [u'This field is required.']
  268. >>> f.clean('')
  269. Traceback (most recent call last):
  270. ...
  271. ValidationError: [u'This field is required.']
  272. >>> f = UKPostcodeField(required=False)
  273. >>> f.clean('BT32 4PX')
  274. u'BT32 4PX'
  275. >>> f.clean('GIR 0AA')
  276. u'GIR 0AA'
  277. >>> f.clean('1NV 4L1D')
  278. Traceback (most recent call last):
  279. ...
  280. ValidationError: [u'Enter a postcode. A space is required between the two postcode parts.']
  281. >>> f.clean('BT324PX')
  282. Traceback (most recent call last):
  283. ...
  284. ValidationError: [u'Enter a postcode. A space is required between the two postcode parts.']
  285. >>> f.clean(None)
  286. u''
  287. >>> f.clean('')
  288. u''
  289. # FRZipCodeField #############################################################
  290. FRZipCodeField validates that the data is a valid FR zipcode.
  291. >>> from django.contrib.localflavor.fr.forms import FRZipCodeField
  292. >>> f = FRZipCodeField()
  293. >>> f.clean('75001')
  294. u'75001'
  295. >>> f.clean('93200')
  296. u'93200'
  297. >>> f.clean('2A200')
  298. Traceback (most recent call last):
  299. ...
  300. ValidationError: [u'Enter a zip code in the format XXXXX.']
  301. >>> f.clean('980001')
  302. Traceback (most recent call last):
  303. ...
  304. ValidationError: [u'Enter a zip code in the format XXXXX.']
  305. >>> f.clean(None)
  306. Traceback (most recent call last):
  307. ...
  308. ValidationError: [u'This field is required.']
  309. >>> f.clean('')
  310. Traceback (most recent call last):
  311. ...
  312. ValidationError: [u'This field is required.']
  313. >>> f = FRZipCodeField(required=False)
  314. >>> f.clean('75001')
  315. u'75001'
  316. >>> f.clean('93200')
  317. u'93200'
  318. >>> f.clean('2A200')
  319. Traceback (most recent call last):
  320. ...
  321. ValidationError: [u'Enter a zip code in the format XXXXX.']
  322. >>> f.clean('980001')
  323. Traceback (most recent call last):
  324. ...
  325. ValidationError: [u'Enter a zip code in the format XXXXX.']
  326. >>> f.clean(None)
  327. u''
  328. >>> f.clean('')
  329. u''
  330. # FRPhoneNumberField ##########################################################
  331. FRPhoneNumberField validates that the data is a valid french phone number.
  332. It's normalized to 0X XX XX XX XX format. Dots are valid too.
  333. >>> from django.contrib.localflavor.fr.forms import FRPhoneNumberField
  334. >>> f = FRPhoneNumberField()
  335. >>> f.clean('01 55 44 58 64')
  336. u'01 55 44 58 64'
  337. >>> f.clean('0155445864')
  338. u'01 55 44 58 64'
  339. >>> f.clean('01 5544 5864')
  340. u'01 55 44 58 64'
  341. >>> f.clean('01 55.44.58.64')
  342. u'01 55 44 58 64'
  343. >>> f.clean('01.55.44.58.64')
  344. u'01 55 44 58 64'
  345. >>> f.clean('01,55,44,58,64')
  346. Traceback (most recent call last):
  347. ...
  348. ValidationError: [u'Phone numbers must be in 0X XX XX XX XX format.']
  349. >>> f.clean('555 015 544')
  350. Traceback (most recent call last):
  351. ...
  352. ValidationError: [u'Phone numbers must be in 0X XX XX XX XX format.']
  353. >>> f.clean(None)
  354. Traceback (most recent call last):
  355. ...
  356. ValidationError: [u'This field is required.']
  357. >>> f.clean('')
  358. Traceback (most recent call last):
  359. ...
  360. ValidationError: [u'This field is required.']
  361. >>> f = FRPhoneNumberField(required=False)
  362. >>> f.clean('01 55 44 58 64')
  363. u'01 55 44 58 64'
  364. >>> f.clean('0155445864')
  365. u'01 55 44 58 64'
  366. >>> f.clean('01 5544 5864')
  367. u'01 55 44 58 64'
  368. >>> f.clean('01 55.44.58.64')
  369. u'01 55 44 58 64'
  370. >>> f.clean('01.55.44.58.64')
  371. u'01 55 44 58 64'
  372. >>> f.clean('01,55,44,58,64')
  373. Traceback (most recent call last):
  374. ...
  375. ValidationError: [u'Phone numbers must be in 0X XX XX XX XX format.']
  376. >>> f.clean('555 015 544')
  377. Traceback (most recent call last):
  378. ...
  379. ValidationError: [u'Phone numbers must be in 0X XX XX XX XX format.']
  380. >>> f.clean(None)
  381. u''
  382. >>> f.clean('')
  383. u''
  384. # FRDepartmentSelect ###############################################################
  385. FRDepartmentSelect is a Select widget that uses a list of french departments
  386. including DOM TOM
  387. >>> from django.contrib.localflavor.fr.forms import FRDepartmentSelect
  388. >>> w = FRDepartmentSelect()
  389. >>> print w.render('dep', 'Paris')
  390. <select name="dep">
  391. <option value="01">01 - Ain</option>
  392. <option value="02">02 - Aisne</option>
  393. <option value="03">03 - Allier</option>
  394. <option value="04">04 - Alpes-de-Haute-Provence</option>
  395. <option value="05">05 - Hautes-Alpes</option>
  396. <option value="06">06 - Alpes-Maritimes</option>
  397. <option value="07">07 - Ardeche</option>
  398. <option value="08">08 - Ardennes</option>
  399. <option value="09">09 - Ariege</option>
  400. <option value="10">10 - Aube</option>
  401. <option value="11">11 - Aude</option>
  402. <option value="12">12 - Aveyron</option>
  403. <option value="13">13 - Bouches-du-Rhone</option>
  404. <option value="14">14 - Calvados</option>
  405. <option value="15">15 - Cantal</option>
  406. <option value="16">16 - Charente</option>
  407. <option value="17">17 - Charente-Maritime</option>
  408. <option value="18">18 - Cher</option>
  409. <option value="19">19 - Correze</option>
  410. <option value="21">21 - Cote-d&#39;Or</option>
  411. <option value="22">22 - Cotes-d&#39;Armor</option>
  412. <option value="23">23 - Creuse</option>
  413. <option value="24">24 - Dordogne</option>
  414. <option value="25">25 - Doubs</option>
  415. <option value="26">26 - Drome</option>
  416. <option value="27">27 - Eure</option>
  417. <option value="28">28 - Eure-et-Loire</option>
  418. <option value="29">29 - Finistere</option>
  419. <option value="2A">2A - Corse-du-Sud</option>
  420. <option value="2B">2B - Haute-Corse</option>
  421. <option value="30">30 - Gard</option>
  422. <option value="31">31 - Haute-Garonne</option>
  423. <option value="32">32 - Gers</option>
  424. <option value="33">33 - Gironde</option>
  425. <option value="34">34 - Herault</option>
  426. <option value="35">35 - Ille-et-Vilaine</option>
  427. <option value="36">36 - Indre</option>
  428. <option value="37">37 - Indre-et-Loire</option>
  429. <option value="38">38 - Isere</option>
  430. <option value="39">39 - Jura</option>
  431. <option value="40">40 - Landes</option>
  432. <option value="41">41 - Loir-et-Cher</option>
  433. <option value="42">42 - Loire</option>
  434. <option value="43">43 - Haute-Loire</option>
  435. <option value="44">44 - Loire-Atlantique</option>
  436. <option value="45">45 - Loiret</option>
  437. <option value="46">46 - Lot</option>
  438. <option value="47">47 - Lot-et-Garonne</option>
  439. <option value="48">48 - Lozere</option>
  440. <option value="49">49 - Maine-et-Loire</option>
  441. <option value="50">50 - Manche</option>
  442. <option value="51">51 - Marne</option>
  443. <option value="52">52 - Haute-Marne</option>
  444. <option value="53">53 - Mayenne</option>
  445. <option value="54">54 - Meurthe-et-Moselle</option>
  446. <option value="55">55 - Meuse</option>
  447. <option value="56">56 - Morbihan</option>
  448. <option value="57">57 - Moselle</option>
  449. <option value="58">58 - Nievre</option>
  450. <option value="59">59 - Nord</option>
  451. <option value="60">60 - Oise</option>
  452. <option value="61">61 - Orne</option>
  453. <option value="62">62 - Pas-de-Calais</option>
  454. <option value="63">63 - Puy-de-Dome</option>
  455. <option value="64">64 - Pyrenees-Atlantiques</option>
  456. <option value="65">65 - Hautes-Pyrenees</option>
  457. <option value="66">66 - Pyrenees-Orientales</option>
  458. <option value="67">67 - Bas-Rhin</option>
  459. <option value="68">68 - Haut-Rhin</option>
  460. <option value="69">69 - Rhone</option>
  461. <option value="70">70 - Haute-Saone</option>
  462. <option value="71">71 - Saone-et-Loire</option>
  463. <option value="72">72 - Sarthe</option>
  464. <option value="73">73 - Savoie</option>
  465. <option value="74">74 - Haute-Savoie</option>
  466. <option value="75">75 - Paris</option>
  467. <option value="76">76 - Seine-Maritime</option>
  468. <option value="77">77 - Seine-et-Marne</option>
  469. <option value="78">78 - Yvelines</option>
  470. <option value="79">79 - Deux-Sevres</option>
  471. <option value="80">80 - Somme</option>
  472. <option value="81">81 - Tarn</option>
  473. <option value="82">82 - Tarn-et-Garonne</option>
  474. <option value="83">83 - Var</option>
  475. <option value="84">84 - Vaucluse</option>
  476. <option value="85">85 - Vendee</option>
  477. <option value="86">86 - Vienne</option>
  478. <option value="87">87 - Haute-Vienne</option>
  479. <option value="88">88 - Vosges</option>
  480. <option value="89">89 - Yonne</option>
  481. <option value="90">90 - Territoire de Belfort</option>
  482. <option value="91">91 - Essonne</option>
  483. <option value="92">92 - Hauts-de-Seine</option>
  484. <option value="93">93 - Seine-Saint-Denis</option>
  485. <option value="94">94 - Val-de-Marne</option>
  486. <option value="95">95 - Val-d&#39;Oise</option>
  487. <option value="2A">2A - Corse du sud</option>
  488. <option value="2B">2B - Haute Corse</option>
  489. <option value="971">971 - Guadeloupe</option>
  490. <option value="972">972 - Martinique</option>
  491. <option value="973">973 - Guyane</option>
  492. <option value="974">974 - La Reunion</option>
  493. <option value="975">975 - Saint-Pierre-et-Miquelon</option>
  494. <option value="976">976 - Mayotte</option>
  495. <option value="984">984 - Terres Australes et Antarctiques</option>
  496. <option value="986">986 - Wallis et Futuna</option>
  497. <option value="987">987 - Polynesie Francaise</option>
  498. <option value="988">988 - Nouvelle-Caledonie</option>
  499. </select>
  500. # JPPostalCodeField ###############################################################
  501. A form field that validates its input is a Japanese postcode.
  502. Accepts 7 digits(with/out hyphen).
  503. >>> from django.contrib.localflavor.jp.forms import JPPostalCodeField
  504. >>> f = JPPostalCodeField()
  505. >>> f.clean('251-0032')
  506. u'2510032'
  507. >>> f.clean('2510032')
  508. u'2510032'
  509. >>> f.clean('2510-032')
  510. Traceback (most recent call last):
  511. ...
  512. ValidationError: [u'Enter a postal code in the format XXXXXXX or XXX-XXXX.']
  513. >>> f.clean('251a0032')
  514. Traceback (most recent call last):
  515. ...
  516. ValidationError: [u'Enter a postal code in the format XXXXXXX or XXX-XXXX.']
  517. >>> f.clean('a51-0032')
  518. Traceback (most recent call last):
  519. ...
  520. ValidationError: [u'Enter a postal code in the format XXXXXXX or XXX-XXXX.']
  521. >>> f.clean('25100321')
  522. Traceback (most recent call last):
  523. ...
  524. ValidationError: [u'Enter a postal code in the format XXXXXXX or XXX-XXXX.']
  525. >>> f.clean('')
  526. Traceback (most recent call last):
  527. ...
  528. ValidationError: [u'This field is required.']
  529. >>> f = JPPostalCodeField(required=False)
  530. >>> f.clean('251-0032')
  531. u'2510032'
  532. >>> f.clean('2510032')
  533. u'2510032'
  534. >>> f.clean('2510-032')
  535. Traceback (most recent call last):
  536. ...
  537. ValidationError: [u'Enter a postal code in the format XXXXXXX or XXX-XXXX.']
  538. >>> f.clean('')
  539. u''
  540. >>> f.clean(None)
  541. u''
  542. # JPPrefectureSelect ###############################################################
  543. A Select widget that uses a list of Japanese prefectures as its choices.
  544. >>> from django.contrib.localflavor.jp.forms import JPPrefectureSelect
  545. >>> w = JPPrefectureSelect()
  546. >>> print w.render('prefecture', 'kanagawa')
  547. <select name="prefecture">
  548. <option value="hokkaido">Hokkaido</option>
  549. <option value="aomori">Aomori</option>
  550. <option value="iwate">Iwate</option>
  551. <option value="miyagi">Miyagi</option>
  552. <option value="akita">Akita</option>
  553. <option value="yamagata">Yamagata</option>
  554. <option value="fukushima">Fukushima</option>
  555. <option value="ibaraki">Ibaraki</option>
  556. <option value="tochigi">Tochigi</option>
  557. <option value="gunma">Gunma</option>
  558. <option value="saitama">Saitama</option>
  559. <option value="chiba">Chiba</option>
  560. <option value="tokyo">Tokyo</option>
  561. <option value="kanagawa" selected="selected">Kanagawa</option>
  562. <option value="yamanashi">Yamanashi</option>
  563. <option value="nagano">Nagano</option>
  564. <option value="niigata">Niigata</option>
  565. <option value="toyama">Toyama</option>
  566. <option value="ishikawa">Ishikawa</option>
  567. <option value="fukui">Fukui</option>
  568. <option value="gifu">Gifu</option>
  569. <option value="shizuoka">Shizuoka</option>
  570. <option value="aichi">Aichi</option>
  571. <option value="mie">Mie</option>
  572. <option value="shiga">Shiga</option>
  573. <option value="kyoto">Kyoto</option>
  574. <option value="osaka">Osaka</option>
  575. <option value="hyogo">Hyogo</option>
  576. <option value="nara">Nara</option>
  577. <option value="wakayama">Wakayama</option>
  578. <option value="tottori">Tottori</option>
  579. <option value="shimane">Shimane</option>
  580. <option value="okayama">Okayama</option>
  581. <option value="hiroshima">Hiroshima</option>
  582. <option value="yamaguchi">Yamaguchi</option>
  583. <option value="tokushima">Tokushima</option>
  584. <option value="kagawa">Kagawa</option>
  585. <option value="ehime">Ehime</option>
  586. <option value="kochi">Kochi</option>
  587. <option value="fukuoka">Fukuoka</option>
  588. <option value="saga">Saga</option>
  589. <option value="nagasaki">Nagasaki</option>
  590. <option value="kumamoto">Kumamoto</option>
  591. <option value="oita">Oita</option>
  592. <option value="miyazaki">Miyazaki</option>
  593. <option value="kagoshima">Kagoshima</option>
  594. <option value="okinawa">Okinawa</option>
  595. </select>
  596. # ITZipCodeField #############################################################
  597. >>> from django.contrib.localflavor.it.forms import ITZipCodeField
  598. >>> f = ITZipCodeField()
  599. >>> f.clean('00100')
  600. u'00100'
  601. >>> f.clean(' 00100')
  602. Traceback (most recent call last):
  603. ...
  604. ValidationError: [u'Enter a valid zip code.']
  605. # ITRegionSelect #############################################################
  606. >>> from django.contrib.localflavor.it.forms import ITRegionSelect
  607. >>> w = ITRegionSelect()
  608. >>> w.render('regions', 'PMN')
  609. u'<select name="regions">\n<option value="ABR">Abruzzo</option>\n<option value="BAS">Basilicata</option>\n<option value="CAL">Calabria</option>\n<option value="CAM">Campania</option>\n<option value="EMR">Emilia-Romagna</option>\n<option value="FVG">Friuli-Venezia Giulia</option>\n<option value="LAZ">Lazio</option>\n<option value="LIG">Liguria</option>\n<option value="LOM">Lombardia</option>\n<option value="MAR">Marche</option>\n<option value="MOL">Molise</option>\n<option value="PMN" selected="selected">Piemonte</option>\n<option value="PUG">Puglia</option>\n<option value="SAR">Sardegna</option>\n<option value="SIC">Sicilia</option>\n<option value="TOS">Toscana</option>\n<option value="TAA">Trentino-Alto Adige</option>\n<option value="UMB">Umbria</option>\n<option value="VAO">Valle d\u2019Aosta</option>\n<option value="VEN">Veneto</option>\n</select>'
  610. # ITSocialSecurityNumberField #################################################
  611. >>> from django.contrib.localflavor.it.forms import ITSocialSecurityNumberField
  612. >>> f = ITSocialSecurityNumberField()
  613. >>> f.clean('LVSGDU99T71H501L')
  614. u'LVSGDU99T71H501L'
  615. >>> f.clean('LBRRME11A01L736W')
  616. u'LBRRME11A01L736W'
  617. >>> f.clean('lbrrme11a01l736w')
  618. u'LBRRME11A01L736W'
  619. >>> f.clean('LBR RME 11A01 L736W')
  620. u'LBRRME11A01L736W'
  621. >>> f.clean('LBRRME11A01L736A')
  622. Traceback (most recent call last):
  623. ...
  624. ValidationError: [u'Enter a valid Social Security number.']
  625. >>> f.clean('%BRRME11A01L736W')
  626. Traceback (most recent call last):
  627. ...
  628. ValidationError: [u'Enter a valid Social Security number.']
  629. # ITVatNumberField ###########################################################
  630. >>> from django.contrib.localflavor.it.forms import ITVatNumberField
  631. >>> f = ITVatNumberField()
  632. >>> f.clean('07973780013')
  633. u'07973780013'
  634. >>> f.clean('7973780013')
  635. u'07973780013'
  636. >>> f.clean(7973780013)
  637. u'07973780013'
  638. >>> f.clean('07973780014')
  639. Traceback (most recent call last):
  640. ...
  641. ValidationError: [u'Enter a valid VAT number.']
  642. >>> f.clean('A7973780013')
  643. Traceback (most recent call last):
  644. ...
  645. ValidationError: [u'Enter a valid VAT number.']
  646. # FIZipCodeField #############################################################
  647. FIZipCodeField validates that the data is a valid FI zipcode.
  648. >>> from django.contrib.localflavor.fi.forms import FIZipCodeField
  649. >>> f = FIZipCodeField()
  650. >>> f.clean('20540')
  651. u'20540'
  652. >>> f.clean('20101')
  653. u'20101'
  654. >>> f.clean('20s40')
  655. Traceback (most recent call last):
  656. ...
  657. ValidationError: [u'Enter a zip code in the format XXXXX.']
  658. >>> f.clean('205401')
  659. Traceback (most recent call last):
  660. ...
  661. ValidationError: [u'Enter a zip code in the format XXXXX.']
  662. >>> f.clean(None)
  663. Traceback (most recent call last):
  664. ...
  665. ValidationError: [u'This field is required.']
  666. >>> f.clean('')
  667. Traceback (most recent call last):
  668. ...
  669. ValidationError: [u'This field is required.']
  670. >>> f = FIZipCodeField(required=False)
  671. >>> f.clean('20540')
  672. u'20540'
  673. >>> f.clean('20101')
  674. u'20101'
  675. >>> f.clean('20s40')
  676. Traceback (most recent call last):
  677. ...
  678. ValidationError: [u'Enter a zip code in the format XXXXX.']
  679. >>> f.clean('205401')
  680. Traceback (most recent call last):
  681. ...
  682. ValidationError: [u'Enter a zip code in the format XXXXX.']
  683. >>> f.clean(None)
  684. u''
  685. >>> f.clean('')
  686. u''
  687. # FIMunicipalitySelect ###############################################################
  688. A Select widget that uses a list of Finnish municipalities as its choices.
  689. >>> from django.contrib.localflavor.fi.forms import FIMunicipalitySelect
  690. >>> w = FIMunicipalitySelect()
  691. >>> unicode(w.render('municipalities', 'turku'))
  692. u'<select name="municipalities">\n<option value="akaa">Akaa</option>\n<option value="alaharma">Alah\xe4rm\xe4</option>\n<option value="alajarvi">Alaj\xe4rvi</option>\n<option value="alastaro">Alastaro</option>\n<option value="alavieska">Alavieska</option>\n<option value="alavus">Alavus</option>\n<option value="anjalankoski">Anjalankoski</option>\n<option value="artjarvi">Artj\xe4rvi</option>\n<option value="asikkala">Asikkala</option>\n<option value="askainen">Askainen</option>\n<option value="askola">Askola</option>\n<option value="aura">Aura</option>\n<option value="brando">Br\xe4nd\xf6</option>\n<option value="dragsfjard">Dragsfj\xe4rd</option>\n<option value="eckero">Ecker\xf6</option>\n<option value="elimaki">Elim\xe4ki</option>\n<option value="eno">Eno</option>\n<option value="enonkoski">Enonkoski</option>\n<option value="enontekio">Enonteki\xf6</option>\n<option value="espoo">Espoo</option>\n<option value="eura">Eura</option>\n<option value="eurajoki">Eurajoki</option>\n<option value="evijarvi">Evij\xe4rvi</option>\n<option value="finstrom">Finstr\xf6m</option>\n<option value="forssa">Forssa</option>\n<option value="foglo">F\xf6gl\xf6</option>\n<option value="geta">Geta</option>\n<option value="haapajarvi">Haapaj\xe4rvi</option>\n<option value="haapavesi">Haapavesi</option>\n<option value="hailuoto">Hailuoto</option>\n<option value="halikko">Halikko</option>\n<option value="halsua">Halsua</option>\n<option value="hamina">Hamina</option>\n<option value="hammarland">Hammarland</option>\n<option value="hankasalmi">Hankasalmi</option>\n<option value="hanko">Hanko</option>\n<option value="harjavalta">Harjavalta</option>\n<option value="hartola">Hartola</option>\n<option value="hattula">Hattula</option>\n<option value="hauho">Hauho</option>\n<option value="haukipudas">Haukipudas</option>\n<option value="hausjarvi">Hausj\xe4rvi</option>\n<option value="heinola">Heinola</option>\n<option value="heinavesi">Hein\xe4vesi</option>\n<option value="helsinki">Helsinki</option>\n<option value="himanka">Himanka</option>\n<option value="hirvensalmi">Hirvensalmi</option>\n<option value="hollola">Hollola</option>\n<option value="honkajoki">Honkajoki</option>\n<option value="houtskari">Houtskari</option>\n<option value="huittinen">Huittinen</option>\n<option value="humppila">Humppila</option>\n<option value="hyrynsalmi">Hyrynsalmi</option>\n<option value="hyvinkaa">Hyvink\xe4\xe4</option>\n<option value="hameenkoski">H\xe4meenkoski</option>\n<option value="hameenkyro">H\xe4meenkyr\xf6</option>\n<option value="hameenlinna">H\xe4meenlinna</option>\n<option value="ii">Ii</option>\n<option value="iisalmi">Iisalmi</option>\n<option value="iitti">Iitti</option>\n<option value="ikaalinen">Ikaalinen</option>\n<option value="ilmajoki">Ilmajoki</option>\n<option value="ilomantsi">Ilomantsi</option>\n<option value="imatra">Imatra</option>\n<option value="inari">Inari</option>\n<option value="inio">Ini\xf6</option>\n<option value="inkoo">Inkoo</option>\n<option value="isojoki">Isojoki</option>\n<option value="isokyro">Isokyr\xf6</option>\n<option value="jaala">Jaala</option>\n<option value="jalasjarvi">Jalasj\xe4rvi</option>\n<option value="janakkala">Janakkala</option>\n<option value="joensuu">Joensuu</option>\n<option value="jokioinen">Jokioinen</option>\n<option value="jomala">Jomala</option>\n<option value="joroinen">Joroinen</option>\n<option value="joutsa">Joutsa</option>\n<option value="joutseno">Joutseno</option>\n<option value="juankoski">Juankoski</option>\n<option value="jurva">Jurva</option>\n<option value="juuka">Juuka</option>\n<option value="juupajoki">Juupajoki</option>\n<option value="juva">Juva</option>\n<option value="jyvaskyla">Jyv\xe4skyl\xe4</option>\n<option value="jyvaskylan_mlk">Jyv\xe4skyl\xe4n maalaiskunta</option>\n<option value="jamijarvi">J\xe4mij\xe4rvi</option>\n<option value="jamsa">J\xe4ms\xe4</option>\n<option value="jamsankoski">J\xe4ms\xe4nkoski</option>\n<option value="jarvenpaa">J\xe4rvenp\xe4\xe4</option>\n<option value="kaarina">Kaarina</option>\n<option value="kaavi">Kaavi</option>\n<option value="kajaani">Kajaani</option>\n<option value="kalajoki">Kalajoki</option>\n<option value="kalvola">Kalvola</option>\n<option value="kangasala">Kangasala</option>\n<option value="kangasniemi">Kangasniemi</option>\n<option value="kankaanpaa">Kankaanp\xe4\xe4</option>\n<option value="kannonkoski">Kannonkoski</option>\n<option value="kannus">Kannus</option>\n<option value="karijoki">Karijoki</option>\n<option value="karjaa">Karjaa</option>\n<option value="karjalohja">Karjalohja</option>\n<option value="karkkila">Karkkila</option>\n<option value="karstula">Karstula</option>\n<option value="karttula">Karttula</option>\n<option value="karvia">Karvia</option>\n<option value="kaskinen">Kaskinen</option>\n<option value="kauhajoki">Kauhajoki</option>\n<option value="kauhava">Kauhava</option>\n<option value="kauniainen">Kauniainen</option>\n<option value="kaustinen">Kaustinen</option>\n<option value="keitele">Keitele</option>\n<option value="kemi">Kemi</option>\n<option value="kemijarvi">Kemij\xe4rvi</option>\n<option value="keminmaa">Keminmaa</option>\n<option value="kemio">Kemi\xf6</option>\n<option value="kempele">Kempele</option>\n<option value="kerava">Kerava</option>\n<option value="kerimaki">Kerim\xe4ki</option>\n<option value="kestila">Kestil\xe4</option>\n<option value="kesalahti">Kes\xe4lahti</option>\n<option value="keuruu">Keuruu</option>\n<option value="kihnio">Kihni\xf6</option>\n<option value="kiikala">Kiikala</option>\n<option value="kiikoinen">Kiikoinen</option>\n<option value="kiiminki">Kiiminki</option>\n<option value="kinnula">Kinnula</option>\n<option value="kirkkonummi">Kirkkonummi</option>\n<option value="kisko">Kisko</option>\n<option value="kitee">Kitee</option>\n<option value="kittila">Kittil\xe4</option>\n<option value="kiukainen">Kiukainen</option>\n<option value="kiuruvesi">Kiuruvesi</option>\n<option value="kivijarvi">Kivij\xe4rvi</option>\n<option value="kokemaki">Kokem\xe4ki</option>\n<option value="kokkola">Kokkola</option>\n<option value="kolari">Kolari</option>\n<option value="konnevesi">Konnevesi</option>\n<option value="kontiolahti">Kontiolahti</option>\n<option value="korpilahti">Korpilahti</option>\n<option value="korppoo">Korppoo</option>\n<option value="korsnas">Korsn\xe4s</option>\n<option value="kortesjarvi">Kortesj\xe4rvi</option>\n<option value="koskitl">KoskiTl</option>\n<option value="kotka">Kotka</option>\n<option value="kouvola">Kouvola</option>\n<option value="kristiinankaupunki">Kristiinankaupunki</option>\n<option value="kruunupyy">Kruunupyy</option>\n<option value="kuhmalahti">Kuhmalahti</option>\n<option value="kuhmo">Kuhmo</option>\n<option value="kuhmoinen">Kuhmoinen</option>\n<option value="kumlinge">Kumlinge</option>\n<option value="kuopio">Kuopio</option>\n<option value="kuortane">Kuortane</option>\n<option value="kurikka">Kurikka</option>\n<option value="kuru">Kuru</option>\n<option value="kustavi">Kustavi</option>\n<option value="kuusamo">Kuusamo</option>\n<option value="kuusankoski">Kuusankoski</option>\n<option value="kuusjoki">Kuusjoki</option>\n<option value="kylmakoski">Kylm\xe4koski</option>\n<option value="kyyjarvi">Kyyj\xe4rvi</option>\n<option value="kalvia">K\xe4lvi\xe4</option>\n<option value="karkola">K\xe4rk\xf6l\xe4</option>\n<option value="karsamaki">K\xe4rs\xe4m\xe4ki</option>\n<option value="kokar">K\xf6kar</option>\n<option value="koylio">K\xf6yli\xf6</option>\n<option value="lahti">Lahti</option>\n<option value="laihia">Laihia</option>\n<option value="laitila">Laitila</option>\n<option value="lammi">Lammi</option>\n<option value="lapinjarvi">Lapinj\xe4rvi</option>\n<option value="lapinlahti">Lapinlahti</option>\n<option value="lappajarvi">Lappaj\xe4rvi</option>\n<option value="lappeenranta">Lappeenranta</option>\n<option value="lappi">Lappi</option>\n<option value="lapua">Lapua</option>\n<option value="laukaa">Laukaa</option>\n<option value="lavia">Lavia</option>\n<option value="lehtimaki">Lehtim\xe4ki</option>\n<option value="leivonmaki">Leivonm\xe4ki</option>\n<option value="lemi">Lemi</option>\n<option value="lemland">Lemland</option>\n<option value="lempaala">Lemp\xe4\xe4l\xe4</option>\n<option value="lemu">Lemu</option>\n<option value="leppavirta">Lepp\xe4virta</option>\n<option value="lestijarvi">Lestij\xe4rvi</option>\n<option value="lieksa">Lieksa</option>\n<option value="lieto">Lieto</option>\n<option value="liljendal">Liljendal</option>\n<option value="liminka">Liminka</option>\n<option value="liperi">Liperi</option>\n<option value="lohja">Lohja</option>\n<option value="lohtaja">Lohtaja</option>\n<option value="loimaa">Loimaa</option>\n<option value="loppi">Loppi</option>\n<option value="loviisa">Loviisa</option>\n<option value="luhanka">Luhanka</option>\n<option value="lumijoki">Lumijoki</option>\n<option value="lumparland">Lumparland</option>\n<option value="luoto">Luoto</option>\n<option value="luumaki">Luum\xe4ki</option>\n<option value="luvia">Luvia</option>\n<option value="maalahti">Maalahti</option>\n<option value="maaninka">Maaninka</option>\n<option value="maarianhamina">Maarianhamina</option>\n<option value="marttila">Marttila</option>\n<option value="masku">Masku</option>\n<option value="mellila">Mellil\xe4</option>\n<option value="merijarvi">Merij\xe4rvi</option>\n<option value="merikarvia">Merikarvia</option>\n<option value="merimasku">Merimasku</option>\n<option value="miehikkala">Miehikk\xe4l\xe4</option>\n<option value="mikkeli">Mikkeli</option>\n<option value="mouhijarvi">Mouhij\xe4rvi</option>\n<option value="muhos">Muhos</option>\n<option value="multia">Multia</option>\n<option value="muonio">Muonio</option>\n<option value="mustasaari">Mustasaari</option>\n<option value="muurame">Muurame</option>\n<option value="muurla">Muurla</option>\n<option value="mynamaki">Myn\xe4m\xe4ki</option>\n<option value="myrskyla">Myrskyl\xe4</option>\n<option value="mantsala">M\xe4nts\xe4l\xe4</option>\n<option value="mantta">M\xe4ntt\xe4</option>\n<option value="mantyharju">M\xe4ntyharju</option>\n<option value="naantali">Naantali</option>\n<option value="nakkila">Nakkila</option>\n<option value="nastola">Nastola</option>\n<option value="nauvo">Nauvo</option>\n<option value="nilsia">Nilsi\xe4</option>\n<option value="nivala">Nivala</option>\n<option value="nokia">Nokia</option>\n<option value="noormarkku">Noormarkku</option>\n<option value="nousiainen">Nousiainen</option>\n<option value="nummi-pusula">Nummi-Pusula</option>\n<option value="nurmes">Nurmes</option>\n<option value="nurmijarvi">Nurmij\xe4rvi</option>\n<option value="nurmo">Nurmo</option>\n<option value="narpio">N\xe4rpi\xf6</option>\n<option value="oravainen">Oravainen</option>\n<option value="orimattila">Orimattila</option>\n<option value="oripaa">Orip\xe4\xe4</option>\n<option value="orivesi">Orivesi</option>\n<option value="oulainen">Oulainen</option>\n<option value="oulu">Oulu</option>\n<option value="oulunsalo">Oulunsalo</option>\n<option value="outokumpu">Outokumpu</option>\n<option value="padasjoki">Padasjoki</option>\n<option value="paimio">Paimio</option>\n<option value="paltamo">Paltamo</option>\n<option value="parainen">Parainen</option>\n<option value="parikkala">Parikkala</option>\n<option value="parkano">Parkano</option>\n<option value="pedersore">Peders\xf6re</option>\n<option value="pelkosenniemi">Pelkosenniemi</option>\n<option value="pello">Pello</option>\n<option value="perho">Perho</option>\n<option value="pernaja">Pernaja</option>\n<option value="pernio">Perni\xf6</option>\n<option value="pertteli">Pertteli</option>\n<option value="pertunmaa">Pertunmaa</option>\n<option value="petajavesi">Pet\xe4j\xe4vesi</option>\n<option value="pieksamaki">Pieks\xe4m\xe4ki</option>\n<option value="pielavesi">Pielavesi</option>\n<option value="pietarsaari">Pietarsaari</option>\n<option value="pihtipudas">Pihtipudas</option>\n<option value="piikkio">Piikki\xf6</option>\n<option value="piippola">Piippola</option>\n<option value="pirkkala">Pirkkala</option>\n<option value="pohja">Pohja</option>\n<option value="polvijarvi">Polvij\xe4rvi</option>\n<option value="pomarkku">Pomarkku</option>\n<option value="pori">Pori</option>\n<option value="pornainen">Pornainen</option>\n<option value="porvoo">Porvoo</option>\n<option value="posio">Posio</option>\n<option value="pudasjarvi">Pudasj\xe4rvi</option>\n<option value="pukkila">Pukkila</option>\n<option value="pulkkila">Pulkkila</option>\n<option value="punkaharju">Punkaharju</option>\n<option value="punkalaidun">Punkalaidun</option>\n<option value="puolanka">Puolanka</option>\n<option value="puumala">Puumala</option>\n<option value="pyhtaa">Pyht\xe4\xe4</option>\n<option value="pyhajoki">Pyh\xe4joki</option>\n<option value="pyhajarvi">Pyh\xe4j\xe4rvi</option>\n<option value="pyhanta">Pyh\xe4nt\xe4</option>\n<option value="pyharanta">Pyh\xe4ranta</option>\n<option value="pyhaselka">Pyh\xe4selk\xe4</option>\n<option value="pylkonmaki">Pylk\xf6nm\xe4ki</option>\n<option value="palkane">P\xe4lk\xe4ne</option>\n<option value="poytya">P\xf6yty\xe4</option>\n<option value="raahe">Raahe</option>\n<option value="raisio">Raisio</option>\n<option value="rantasalmi">Rantasalmi</option>\n<option value="rantsila">Rantsila</option>\n<option value="ranua">Ranua</option>\n<option value="rauma">Rauma</option>\n<option value="rautalampi">Rautalampi</option>\n<option value="rautavaara">Rautavaara</option>\n<option value="rautjarvi">Rautj\xe4rvi</option>\n<option value="reisjarvi">Reisj\xe4rvi</option>\n<option value="renko">Renko</option>\n<option value="riihimaki">Riihim\xe4ki</option>\n<option value="ristiina">Ristiina</option>\n<option value="ristijarvi">Ristij\xe4rvi</option>\n<option value="rovaniemi">Rovaniemi</option>\n<option value="ruokolahti">Ruokolahti</option>\n<option value="ruotsinpyhtaa">Ruotsinpyht\xe4\xe4</option>\n<option value="ruovesi">Ruovesi</option>\n<option value="rusko">Rusko</option>\n<option value="rymattyla">Rym\xe4ttyl\xe4</option>\n<option value="raakkyla">R\xe4\xe4kkyl\xe4</option>\n<option value="saarijarvi">Saarij\xe4rvi</option>\n<option value="salla">Salla</option>\n<option value="salo">Salo</option>\n<option value="saltvik">Saltvik</option>\n<option value="sammatti">Sammatti</option>\n<option value="sauvo">Sauvo</option>\n<option value="savitaipale">Savitaipale</option>\n<option value="savonlinna">Savonlinna</option>\n<option value="savonranta">Savonranta</option>\n<option value="savukoski">Savukoski</option>\n<option value="seinajoki">Sein\xe4joki</option>\n<option value="sievi">Sievi</option>\n<option value="siikainen">Siikainen</option>\n<option value="siikajoki">Siikajoki</option>\n<option value="siilinjarvi">Siilinj\xe4rvi</option>\n<option value="simo">Simo</option>\n<option value="sipoo">Sipoo</option>\n<option value="siuntio">Siuntio</option>\n<option value="sodankyla">Sodankyl\xe4</option>\n<option value="soini">Soini</option>\n<option value="somero">Somero</option>\n<option value="sonkajarvi">Sonkaj\xe4rvi</option>\n<option value="sotkamo">Sotkamo</option>\n<option value="sottunga">Sottunga</option>\n<option value="sulkava">Sulkava</option>\n<option value="sund">Sund</option>\n<option value="suomenniemi">Suomenniemi</option>\n<option value="suomusjarvi">Suomusj\xe4rvi</option>\n<option value="suomussalmi">Suomussalmi</option>\n<option value="suonenjoki">Suonenjoki</option>\n<option value="sysma">Sysm\xe4</option>\n<option value="sakyla">S\xe4kyl\xe4</option>\n<option value="sarkisalo">S\xe4rkisalo</option>\n<option value="taipalsaari">Taipalsaari</option>\n<option value="taivalkoski">Taivalkoski</option>\n<option value="taivassalo">Taivassalo</option>\n<option value="tammela">Tammela</option>\n<option value="tammisaari">Tammisaari</option>\n<option value="tampere">Tampere</option>\n<option value="tarvasjoki">Tarvasjoki</option>\n<option value="tervo">Tervo</option>\n<option value="tervola">Tervola</option>\n<option value="teuva">Teuva</option>\n<option value="tohmajarvi">Tohmaj\xe4rvi</option>\n<option value="toholampi">Toholampi</option>\n<option value="toivakka">Toivakka</option>\n<option value="tornio">Tornio</option>\n<option value="turku" selected="selected">Turku</option>\n<option value="tuulos">Tuulos</option>\n<option value="tuusniemi">Tuusniemi</option>\n<option value="tuusula">Tuusula</option>\n<option value="tyrnava">Tyrn\xe4v\xe4</option>\n<option value="toysa">T\xf6ys\xe4</option>\n<option value="ullava">Ullava</option>\n<option value="ulvila">Ulvila</option>\n<option value="urjala">Urjala</option>\n<option value="utajarvi">Utaj\xe4rvi</option>\n<option value="utsjoki">Utsjoki</option>\n<option value="uurainen">Uurainen</option>\n<option value="uusikaarlepyy">Uusikaarlepyy</option>\n<option value="uusikaupunki">Uusikaupunki</option>\n<option value="vaala">Vaala</option>\n<option value="vaasa">Vaasa</option>\n<option value="vahto">Vahto</option>\n<option value="valkeakoski">Valkeakoski</option>\n<option value="valkeala">Valkeala</option>\n<option value="valtimo">Valtimo</option>\n<option value="vammala">Vammala</option>\n<option value="vampula">Vampula</option>\n<option value="vantaa">Vantaa</option>\n<option value="varkaus">Varkaus</option>\n<option value="varpaisjarvi">Varpaisj\xe4rvi</option>\n<option value="vehmaa">Vehmaa</option>\n<option value="velkua">Velkua</option>\n<option value="vesanto">Vesanto</option>\n<option value="vesilahti">Vesilahti</option>\n<option value="veteli">Veteli</option>\n<option value="vierema">Vierem\xe4</option>\n<option value="vihanti">Vihanti</option>\n<option value="vihti">Vihti</option>\n<option value="viitasaari">Viitasaari</option>\n<option value="vilppula">Vilppula</option>\n<option value="vimpeli">Vimpeli</option>\n<option value="virolahti">Virolahti</option>\n<option value="virrat">Virrat</option>\n<option value="vardo">V\xe5rd\xf6</option>\n<option value="vahakyro">V\xe4h\xe4kyr\xf6</option>\n<option value="vastanfjard">V\xe4stanfj\xe4rd</option>\n<option value="voyri-maksamaa">V\xf6yri-Maksamaa</option>\n<option value="yliharma">Ylih\xe4rm\xe4</option>\n<option value="yli-ii">Yli-Ii</option>\n<option value="ylikiiminki">Ylikiiminki</option>\n<option value="ylistaro">Ylistaro</option>\n<option value="ylitornio">Ylitornio</option>\n<option value="ylivieska">Ylivieska</option>\n<option value="ylamaa">Yl\xe4maa</option>\n<option value="ylane">Yl\xe4ne</option>\n<option value="ylojarvi">Yl\xf6j\xe4rvi</option>\n<option value="ypaja">Yp\xe4j\xe4</option>\n<option value="aetsa">\xc4ets\xe4</option>\n<option value="ahtari">\xc4ht\xe4ri</option>\n<option value="aanekoski">\xc4\xe4nekoski</option>\n</select>'
  693. # FISocialSecurityNumber
  694. ##############################################################
  695. >>> from django.contrib.localflavor.fi.forms import FISocialSecurityNumber
  696. >>> f = FISocialSecurityNumber()
  697. >>> f.clean('010101-0101')
  698. u'010101-0101'
  699. >>> f.clean('010101+0101')
  700. u'010101+0101'
  701. >>> f.clean('010101A0101')
  702. u'010101A0101'
  703. >>> f.clean('101010-0102')
  704. Traceback (most recent call last):
  705. ...
  706. ValidationError: [u'Enter a valid Finnish social security number.']
  707. >>> f.clean('10a010-0101')
  708. Traceback (most recent call last):
  709. ...
  710. ValidationError: [u'Enter a valid Finnish social security number.']
  711. >>> f.clean('101010-0\xe401')
  712. Traceback (most recent call last):
  713. ...
  714. ValidationError: [u'Enter a valid Finnish social security number.']
  715. >>> f.clean('101010b0101')
  716. Traceback (most recent call last):
  717. ...
  718. ValidationError: [u'Enter a valid Finnish social security number.']
  719. >>> f.clean('')
  720. Traceback (most recent call last):
  721. ...
  722. ValidationError: [u'This field is required.']
  723. >>> f.clean(None)
  724. Traceback (most recent call last):
  725. ...
  726. ValidationError: [u'This field is required.']
  727. >>> f = FISocialSecurityNumber(required=False)
  728. >>> f.clean('010101-0101')
  729. u'010101-0101'
  730. >>> f.clean(None)
  731. u''
  732. >>> f.clean('')
  733. u''
  734. # BRZipCodeField ############################################################
  735. >>> from django.contrib.localflavor.br.forms import BRZipCodeField
  736. >>> f = BRZipCodeField()
  737. >>> f.clean('12345-123')
  738. u'12345-123'
  739. >>> f.clean('12345_123')
  740. Traceback (most recent call last):
  741. ...
  742. ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
  743. >>> f.clean('1234-123')
  744. Traceback (most recent call last):
  745. ...
  746. ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
  747. >>> f.clean('abcde-abc')
  748. Traceback (most recent call last):
  749. ...
  750. ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
  751. >>> f.clean('12345-')
  752. Traceback (most recent call last):
  753. ...
  754. ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
  755. >>> f.clean('-123')
  756. Traceback (most recent call last):
  757. ...
  758. ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
  759. >>> f.clean('')
  760. Traceback (most recent call last):
  761. ...
  762. ValidationError: [u'This field is required.']
  763. >>> f.clean(None)
  764. Traceback (most recent call last):
  765. ...
  766. ValidationError: [u'This field is required.']
  767. >>> f = BRZipCodeField(required=False)
  768. >>> f.clean(None)
  769. u''
  770. >>> f.clean('')
  771. u''
  772. >>> f.clean('-123')
  773. Traceback (most recent call last):
  774. ...
  775. ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
  776. >>> f.clean('12345-')
  777. Traceback (most recent call last):
  778. ...
  779. ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
  780. >>> f.clean('abcde-abc')
  781. Traceback (most recent call last):
  782. ...
  783. ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
  784. >>> f.clean('1234-123')
  785. Traceback (most recent call last):
  786. ...
  787. ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
  788. >>> f.clean('12345_123')
  789. Traceback (most recent call last):
  790. ...
  791. ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
  792. >>> f.clean('12345-123')
  793. u'12345-123'
  794. # BRPhoneNumberField #########################################################
  795. >>> from django.contrib.localflavor.br.forms import BRPhoneNumberField
  796. >>> f = BRPhoneNumberField()
  797. >>> f.clean('41-3562-3464')
  798. u'41-3562-3464'
  799. >>> f.clean('4135623464')
  800. u'41-3562-3464'
  801. >>> f.clean('41 3562-3464')
  802. u'41-3562-3464'
  803. >>> f.clean('41 3562 3464')
  804. u'41-3562-3464'
  805. >>> f.clean('(41) 3562 3464')
  806. u'41-3562-3464'
  807. >>> f.clean('41.3562.3464')
  808. u'41-3562-3464'
  809. >>> f.clean('41.3562-3464')
  810. u'41-3562-3464'
  811. >>> f.clean(' (41) 3562.3464')
  812. u'41-3562-3464'
  813. >>> f.clean(None)
  814. Traceback (most recent call last):
  815. ...
  816. ValidationError: [u'This field is required.']
  817. >>> f.clean('')
  818. Traceback (most recent call last):
  819. ...
  820. ValidationError: [u'This field is required.']
  821. >>> f = BRPhoneNumberField(required=False)
  822. >>> f.clean('')
  823. u''
  824. >>> f.clean(None)
  825. u''
  826. >>> f.clean(' (41) 3562.3464')
  827. u'41-3562-3464'
  828. >>> f.clean('41.3562-3464')
  829. u'41-3562-3464'
  830. >>> f.clean('(41) 3562 3464')
  831. u'41-3562-3464'
  832. >>> f.clean('4135623464')
  833. u'41-3562-3464'
  834. >>> f.clean('41 3562-3464')
  835. u'41-3562-3464'
  836. # BRStateSelect ##############################################################
  837. >>> from django.contrib.localflavor.br.forms import BRStateSelect
  838. >>> w = BRStateSelect()
  839. >>> w.render('states', 'PR')
  840. u'<select name="states">\n<option value="AC">Acre</option>\n<option value="AL">Alagoas</option>\n<option value="AP">Amap\xe1</option>\n<option value="AM">Amazonas</option>\n<option value="BA">Bahia</option>\n<option value="CE">Cear\xe1</option>\n<option value="DF">Distrito Federal</option>\n<option value="ES">Esp\xedrito Santo</option>\n<option value="GO">Goi\xe1s</option>\n<option value="MA">Maranh\xe3o</option>\n<option value="MT">Mato Grosso</option>\n<option value="MS">Mato Grosso do Sul</option>\n<option value="MG">Minas Gerais</option>\n<option value="PA">Par\xe1</option>\n<option value="PB">Para\xedba</option>\n<option value="PR" selected="selected">Paran\xe1</option>\n<option value="PE">Pernambuco</option>\n<option value="PI">Piau\xed</option>\n<option value="RJ">Rio de Janeiro</option>\n<option value="RN">Rio Grande do Norte</option>\n<option value="RS">Rio Grande do Sul</option>\n<option value="RO">Rond\xf4nia</option>\n<option value="RR">Roraima</option>\n<option value="SC">Santa Catarina</option>\n<option value="SP">S\xe3o Paulo</option>\n<option value="SE">Sergipe</option>\n<option value="TO">Tocantins</option>\n</select>'
  841. # DEZipCodeField ##############################################################
  842. >>> from django.contrib.localflavor.de.forms import DEZipCodeField
  843. >>> f = DEZipCodeField()
  844. >>> f.clean('99423')
  845. u'99423'
  846. >>> f.clean(' 99423')
  847. Traceback (most recent call last):
  848. ...
  849. ValidationError: [u'Enter a zip code in the format XXXXX.']
  850. # DEStateSelect #############################################################
  851. >>> from django.contrib.localflavor.de.forms import DEStateSelect
  852. >>> w = DEStateSelect()
  853. >>> w.render('states', 'TH')
  854. u'<select name="states">\n<option value="BW">Baden-Wuerttemberg</option>\n<option value="BY">Bavaria</option>\n<option value="BE">Berlin</option>\n<option value="BB">Brandenburg</option>\n<option value="HB">Bremen</option>\n<option value="HH">Hamburg</option>\n<option value="HE">Hessen</option>\n<option value="MV">Mecklenburg-Western Pomerania</option>\n<option value="NI">Lower Saxony</option>\n<option value="NW">North Rhine-Westphalia</option>\n<option value="RP">Rhineland-Palatinate</option>\n<option value="SL">Saarland</option>\n<option value="SN">Saxony</option>\n<option value="ST">Saxony-Anhalt</option>\n<option value="SH">Schleswig-Holstein</option>\n<option value="TH" selected="selected">Thuringia</option>\n</select>'
  855. # DEIdentityCardNumberField #################################################
  856. >>> from django.contrib.localflavor.de.forms import DEIdentityCardNumberField
  857. >>> f = DEIdentityCardNumberField()
  858. >>> f.clean('7549313035D-6004103-0903042-0')
  859. u'7549313035D-6004103-0903042-0'
  860. >>> f.clean('9786324830D 6104243 0910271 2')
  861. u'9786324830D-6104243-0910271-2'
  862. >>> f.clean('0434657485D-6407276-0508137-9')
  863. Traceback (most recent call last):
  864. ...
  865. ValidationError: [u'Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format.']
  866. ## AUPostCodeField ##########################################################
  867. A field that accepts a four digit Australian post code.
  868. >>> from django.contrib.localflavor.au.forms import AUPostCodeField
  869. >>> f = AUPostCodeField()
  870. >>> f.clean('1234')
  871. u'1234'
  872. >>> f.clean('2000')
  873. u'2000'
  874. >>> f.clean('abcd')
  875. Traceback (most recent call last):
  876. ...
  877. ValidationError: [u'Enter a 4 digit post code.']
  878. >>> f.clean('20001')
  879. Traceback (most recent call last):
  880. ...
  881. ValidationError: [u'Enter a 4 digit post code.']
  882. >>> f.clean(None)
  883. Traceback (most recent call last):
  884. ...
  885. ValidationError: [u'This field is required.']
  886. >>> f.clean('')
  887. Traceback (most recent call last):
  888. ...
  889. ValidationError: [u'This field is required.']
  890. >>> f = AUPostCodeField(required=False)
  891. >>> f.clean('1234')
  892. u'1234'
  893. >>> f.clean('2000')
  894. u'2000'
  895. >>> f.clean('abcd')
  896. Traceback (most recent call last):
  897. ...
  898. ValidationError: [u'Enter a 4 digit post code.']
  899. >>> f.clean('20001')
  900. Traceback (most recent call last):
  901. ...
  902. ValidationError: [u'Enter a 4 digit post code.']
  903. >>> f.clean(None)
  904. u''
  905. >>> f.clean('')
  906. u''
  907. ## AUPhoneNumberField ########################################################
  908. A field that accepts a 10 digit Australian phone number.
  909. llows spaces and parentheses around area code.
  910. >>> from django.contrib.localflavor.au.forms import AUPhoneNumberField
  911. >>> f = AUPhoneNumberField()
  912. >>> f.clean('1234567890')
  913. u'1234567890'
  914. >>> f.clean('0213456789')
  915. u'0213456789'
  916. >>> f.clean('02 13 45 67 89')
  917. u'0213456789'
  918. >>> f.clean('(02) 1345 6789')
  919. u'0213456789'
  920. >>> f.clean('(02) 1345-6789')
  921. u'0213456789'
  922. >>> f.clean('(02)1345-6789')
  923. u'0213456789'
  924. >>> f.clean('0408 123 456')
  925. u'0408123456'
  926. >>> f.clean('123')
  927. Traceback (most recent call last):
  928. ...
  929. ValidationError: [u'Phone numbers must contain 10 digits.']
  930. >>> f.clean('1800DJANGO')
  931. Traceback (most recent call last):
  932. ...
  933. ValidationError: [u'Phone numbers must contain 10 digits.']
  934. >>> f.clean(None)
  935. Traceback (most recent call last):
  936. ...
  937. ValidationError: [u'This field is required.']
  938. >>> f.clean('')
  939. Traceback (most recent call last):
  940. ...
  941. ValidationError: [u'This field is required.']
  942. >>> f = AUPhoneNumberField(required=False)
  943. >>> f.clean('1234567890')
  944. u'1234567890'
  945. >>> f.clean('0213456789')
  946. u'0213456789'
  947. >>> f.clean('02 13 45 67 89')
  948. u'0213456789'
  949. >>> f.clean('(02) 1345 6789')
  950. u'0213456789'
  951. >>> f.clean('(02) 1345-6789')
  952. u'0213456789'
  953. >>> f.clean('(02)1345-6789')
  954. u'0213456789'
  955. >>> f.clean('0408 123 456')
  956. u'0408123456'
  957. >>> f.clean('123')
  958. Traceback (most recent call last):
  959. ...
  960. ValidationError: [u'Phone numbers must contain 10 digits.']
  961. >>> f.clean('1800DJANGO')
  962. Traceback (most recent call last):
  963. ...
  964. ValidationError: [u'Phone numbers must contain 10 digits.']
  965. >>> f.clean(None)
  966. u''
  967. >>> f.clean('')
  968. u''
  969. ## AUStateSelect #############################################################
  970. AUStateSelect is a Select widget that uses a list of Australian
  971. states/territories as its choices.
  972. >>> from django.contrib.localflavor.au.forms import AUStateSelect
  973. >>> f = AUStateSelect()
  974. >>> print f.render('state', 'NSW')
  975. <select name="state">
  976. <option value="ACT">Australian Capital Territory</option>
  977. <option value="NSW" selected="selected">New South Wales</option>
  978. <option value="NT">Northern Territory</option>
  979. <option value="QLD">Queensland</option>
  980. <option value="SA">South Australia</option>
  981. <option value="TAS">Tasmania</option>
  982. <option value="VIC">Victoria</option>
  983. <option value="WA">Western Australia</option>
  984. </select>
  985. """