Change stuff to use excel files
This commit is contained in:
Binary file not shown.
@@ -8,7 +8,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2017-10-30 13:41+0100\n"
|
"POT-Creation-Date: 2017-10-31 21:09+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@@ -201,7 +201,7 @@ msgid "Place of residence"
|
|||||||
msgstr "Place of residence"
|
msgstr "Place of residence"
|
||||||
|
|
||||||
#: .\members\models.py:19 .\members\models.py:70
|
#: .\members\models.py:19 .\members\models.py:70
|
||||||
#: .\members\templates\member_add_many.html:35
|
#: .\members\templates\member_add_many.html:39
|
||||||
msgid "AYY"
|
msgid "AYY"
|
||||||
msgstr "AYY"
|
msgstr "AYY"
|
||||||
|
|
||||||
@@ -225,7 +225,7 @@ msgstr "Source"
|
|||||||
msgid "Cash"
|
msgid "Cash"
|
||||||
msgstr "Cash"
|
msgstr "Cash"
|
||||||
|
|
||||||
#: .\members\models.py:72 .\members\templates\member_add_many.html:36
|
#: .\members\models.py:72 .\members\templates\member_add_many.html:40
|
||||||
msgid "Bank transfer"
|
msgid "Bank transfer"
|
||||||
msgstr "Bank transfer"
|
msgstr "Bank transfer"
|
||||||
|
|
||||||
@@ -284,7 +284,7 @@ msgid "Muista myös maksaa jäsenmaksusi!"
|
|||||||
msgstr "Don't forget to pay your membership fee!"
|
msgstr "Don't forget to pay your membership fee!"
|
||||||
|
|
||||||
#: .\members\templates\application_index.html:16
|
#: .\members\templates\application_index.html:16
|
||||||
#: .\members\templates\member_add_many.html:48
|
#: .\members\templates\member_add_many.html:55
|
||||||
#: .\members\templates\member_add_many_confirm.html:22
|
#: .\members\templates\member_add_many_confirm.html:22
|
||||||
#: .\webapp\templates\kaehmy_list.html:48
|
#: .\webapp\templates\kaehmy_list.html:48
|
||||||
msgid "Send"
|
msgid "Send"
|
||||||
@@ -322,48 +322,50 @@ msgstr ""
|
|||||||
msgid ""
|
msgid ""
|
||||||
"\n"
|
"\n"
|
||||||
" Enter member information in CSV format, separate members on "
|
" Enter member information in CSV format, separate members on "
|
||||||
"separate lines.\n"
|
"separate lines. \n"
|
||||||
|
" If a new member already exists in the database, a new payment "
|
||||||
|
"event will be created for that member instead.\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: .\members\templates\member_add_many.html:18
|
#: .\members\templates\member_add_many.html:21
|
||||||
|
msgid "Format the member table like this:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: .\members\templates\member_add_many.html:25
|
||||||
msgid ""
|
msgid ""
|
||||||
"\n"
|
"Columns: First name, last name, email address, place of origin, AYY member, "
|
||||||
" first_name, last_name, email_address and place_of_origin should "
|
"JAS recipient"
|
||||||
"be given string values.\n"
|
|
||||||
" ayy_member and jas_recipient should be given the value 0 (off) "
|
|
||||||
"or 1 (on).\n"
|
|
||||||
" "
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"\n"
|
|
||||||
" first_name, last_name, email_address and place_of_origin should "
|
|
||||||
"be given string values.\n"
|
|
||||||
" ayy_member and jas_recipient should be given the value 0 (off) "
|
|
||||||
"or 1 (on).\n"
|
|
||||||
" "
|
|
||||||
|
|
||||||
#: .\members\templates\member_add_many.html:23
|
#: .\members\templates\member_add_many.html:28
|
||||||
msgid "Syntax"
|
msgid "Save the file as CSV"
|
||||||
msgstr "Syntax"
|
|
||||||
|
|
||||||
#: .\members\templates\member_add_many.html:29
|
|
||||||
msgid "Data"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: .\members\templates\member_add_many.html:33
|
#: .\members\templates\member_add_many.html:33
|
||||||
msgid "Payment source"
|
msgid "Upload file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: .\members\templates\member_add_many.html:37
|
#: .\members\templates\member_add_many.html:37
|
||||||
msgid "Cash payment"
|
msgid "Payment source"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: .\members\templates\member_add_many.html:41
|
#: .\members\templates\member_add_many.html:41
|
||||||
msgid "CSV delimiter"
|
msgid "Cash payment"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: .\members\templates\member_add_many.html:44
|
#: .\members\templates\member_add_many.html:44
|
||||||
msgid ""
|
msgid ""
|
||||||
|
"This payment source will be used to create any payments for new members that "
|
||||||
|
"already exist in the database."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: .\members\templates\member_add_many.html:48
|
||||||
|
msgid "CSV delimiter"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: .\members\templates\member_add_many.html:51
|
||||||
|
msgid ""
|
||||||
"The symbol that is used to separate items in one line. Defaults to "
|
"The symbol that is used to separate items in one line. Defaults to "
|
||||||
"';' (semicolon)."
|
"';' (semicolon)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -469,11 +471,11 @@ msgstr "Member register"
|
|||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Language"
|
msgstr "Language"
|
||||||
|
|
||||||
#: .\members\templates\settings.html:20 .\sikweb\base.py:222
|
#: .\members\templates\settings.html:20 .\sikweb\base.py:226
|
||||||
msgid "Finnish"
|
msgid "Finnish"
|
||||||
msgstr "Finnish"
|
msgstr "Finnish"
|
||||||
|
|
||||||
#: .\members\templates\settings.html:21 .\sikweb\base.py:223
|
#: .\members\templates\settings.html:21 .\sikweb\base.py:227
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr "English"
|
msgstr "English"
|
||||||
|
|
||||||
@@ -560,9 +562,9 @@ msgstr "Successfully updated payment"
|
|||||||
msgid "Could not update payment object"
|
msgid "Could not update payment object"
|
||||||
msgstr "Could not update payment object"
|
msgstr "Could not update payment object"
|
||||||
|
|
||||||
#: .\members\views\utils.py:117
|
#: .\members\views\utils.py:121
|
||||||
msgid "Missing \"textfield\" POST request field"
|
msgid "Missing CSV file"
|
||||||
msgstr "Missing \"textfield\" POST request field"
|
msgstr ""
|
||||||
|
|
||||||
#: .\templates\admin\base_site.html:43
|
#: .\templates\admin\base_site.html:43
|
||||||
msgid "Go"
|
msgid "Go"
|
||||||
@@ -576,7 +578,7 @@ msgstr "Error"
|
|||||||
msgid "Back"
|
msgid "Back"
|
||||||
msgstr "Back"
|
msgstr "Back"
|
||||||
|
|
||||||
#: .\templates\footer.html:23
|
#: .\templates\footer.html:23 .\webapp\templates\kaehmy_footer.html:23
|
||||||
msgid "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
|
msgid "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
|
||||||
msgstr "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
|
msgstr "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
|
||||||
|
|
||||||
@@ -850,7 +852,7 @@ msgstr ""
|
|||||||
msgid "SIK Admin"
|
msgid "SIK Admin"
|
||||||
msgstr "SIK Admin"
|
msgstr "SIK Admin"
|
||||||
|
|
||||||
#: .\webapp\templates\base.html:15
|
#: .\webapp\templates\base.html:15 .\webapp\templates\kaehmy_base.html:14
|
||||||
msgid "Aalto-yliopiston Sähköinsinöörikilta ry"
|
msgid "Aalto-yliopiston Sähköinsinöörikilta ry"
|
||||||
msgstr "Aalto-yliopiston Sähköinsinöörikilta ry"
|
msgstr "Aalto-yliopiston Sähköinsinöörikilta ry"
|
||||||
|
|
||||||
@@ -1047,5 +1049,26 @@ msgstr "All challenges"
|
|||||||
msgid "Total challenges:"
|
msgid "Total challenges:"
|
||||||
msgstr "Total challenges:"
|
msgstr "Total challenges:"
|
||||||
|
|
||||||
|
#~ msgid ""
|
||||||
|
#~ "\n"
|
||||||
|
#~ " first_name, last_name, email_address and place_of_origin "
|
||||||
|
#~ "should be given string values.\n"
|
||||||
|
#~ " ayy_member and jas_recipient should be given the value 0 "
|
||||||
|
#~ "(off) or 1 (on).\n"
|
||||||
|
#~ " "
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "\n"
|
||||||
|
#~ " first_name, last_name, email_address and place_of_origin "
|
||||||
|
#~ "should be given string values.\n"
|
||||||
|
#~ " ayy_member and jas_recipient should be given the value 0 "
|
||||||
|
#~ "(off) or 1 (on).\n"
|
||||||
|
#~ " "
|
||||||
|
|
||||||
|
#~ msgid "Syntax"
|
||||||
|
#~ msgstr "Syntax"
|
||||||
|
|
||||||
|
#~ msgid "Missing \"textfield\" POST request field"
|
||||||
|
#~ msgstr "Missing \"textfield\" POST request field"
|
||||||
|
|
||||||
#~ msgid "Options"
|
#~ msgid "Options"
|
||||||
#~ msgstr "Options"
|
#~ msgstr "Options"
|
||||||
|
|||||||
Binary file not shown.
@@ -7,8 +7,8 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2017-10-30 13:41+0100\n"
|
"POT-Creation-Date: 2017-10-31 21:09+0100\n"
|
||||||
"PO-Revision-Date: 2017-10-30 14:42+0200\n"
|
"PO-Revision-Date: 2017-10-31 22:11+0200\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"Language: fi\n"
|
"Language: fi\n"
|
||||||
@@ -202,7 +202,7 @@ msgid "Place of residence"
|
|||||||
msgstr "Asuinpaikka"
|
msgstr "Asuinpaikka"
|
||||||
|
|
||||||
#: .\members\models.py:19 .\members\models.py:70
|
#: .\members\models.py:19 .\members\models.py:70
|
||||||
#: .\members\templates\member_add_many.html:35
|
#: .\members\templates\member_add_many.html:39
|
||||||
msgid "AYY"
|
msgid "AYY"
|
||||||
msgstr "AYY"
|
msgstr "AYY"
|
||||||
|
|
||||||
@@ -226,7 +226,7 @@ msgstr "Lähde"
|
|||||||
msgid "Cash"
|
msgid "Cash"
|
||||||
msgstr "Käteinen"
|
msgstr "Käteinen"
|
||||||
|
|
||||||
#: .\members\models.py:72 .\members\templates\member_add_many.html:36
|
#: .\members\models.py:72 .\members\templates\member_add_many.html:40
|
||||||
msgid "Bank transfer"
|
msgid "Bank transfer"
|
||||||
msgstr "Tilisiirto"
|
msgstr "Tilisiirto"
|
||||||
|
|
||||||
@@ -283,7 +283,7 @@ msgid "Muista myös maksaa jäsenmaksusi!"
|
|||||||
msgstr "Muista myös maksaa jäsenmaksusi!"
|
msgstr "Muista myös maksaa jäsenmaksusi!"
|
||||||
|
|
||||||
#: .\members\templates\application_index.html:16
|
#: .\members\templates\application_index.html:16
|
||||||
#: .\members\templates\member_add_many.html:48
|
#: .\members\templates\member_add_many.html:55
|
||||||
#: .\members\templates\member_add_many_confirm.html:22
|
#: .\members\templates\member_add_many_confirm.html:22
|
||||||
#: .\webapp\templates\kaehmy_list.html:48
|
#: .\webapp\templates\kaehmy_list.html:48
|
||||||
msgid "Send"
|
msgid "Send"
|
||||||
@@ -321,50 +321,58 @@ msgstr "Lisää useita"
|
|||||||
msgid ""
|
msgid ""
|
||||||
"\n"
|
"\n"
|
||||||
" Enter member information in CSV format, separate members on "
|
" Enter member information in CSV format, separate members on "
|
||||||
"separate lines.\n"
|
"separate lines. \n"
|
||||||
|
" If a new member already exists in the database, a new payment "
|
||||||
|
"event will be created for that member instead.\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"\n"
|
"\n"
|
||||||
" Syötä jäsentiedot CSV-formaatissa, erilliset jäsenet omilla "
|
" Syötä jäsentiedot CSV-formaatissa, erilliset jäsenet omilla "
|
||||||
"riveillään.\n"
|
"riveillään.\n"
|
||||||
" "
|
" Jos jäsenen tiedot ovat jo tietokannassa, tehdään tälle "
|
||||||
|
"jäsenelle uusi maksutapahtuma."
|
||||||
|
|
||||||
#: .\members\templates\member_add_many.html:18
|
#: .\members\templates\member_add_many.html:21
|
||||||
|
msgid "Format the member table like this:"
|
||||||
|
msgstr "Jäsentele taulukko seuraavasti:"
|
||||||
|
|
||||||
|
#: .\members\templates\member_add_many.html:25
|
||||||
msgid ""
|
msgid ""
|
||||||
"\n"
|
"Columns: First name, last name, email address, place of origin, AYY member, "
|
||||||
" first_name, last_name, email_address and place_of_origin should "
|
"JAS recipient"
|
||||||
"be given string values.\n"
|
|
||||||
" ayy_member and jas_recipient should be given the value 0 (off) "
|
|
||||||
"or 1 (on).\n"
|
|
||||||
" "
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"\n"
|
"Kolumnit: Etunimi, sukunimi, sähköpostiosoite, asuinpaikka, AYY:n jäsen, "
|
||||||
" first_name, last_name, email_address ja place_of_origin ovat "
|
"jäsenmailin vastaanottaja"
|
||||||
"merkkijonoja.\n"
|
|
||||||
" ayy_member ja jas_recipient ovat joko 0 (off) tai 1 (on).\n"
|
|
||||||
" "
|
|
||||||
|
|
||||||
#: .\members\templates\member_add_many.html:23
|
#: .\members\templates\member_add_many.html:28
|
||||||
msgid "Syntax"
|
msgid "Save the file as CSV"
|
||||||
msgstr "Syntaksi"
|
msgstr "Tallenna tiedosto CSV-formaatissa"
|
||||||
|
|
||||||
#: .\members\templates\member_add_many.html:29
|
|
||||||
msgid "Data"
|
|
||||||
msgstr "Data"
|
|
||||||
|
|
||||||
#: .\members\templates\member_add_many.html:33
|
#: .\members\templates\member_add_many.html:33
|
||||||
|
msgid "Upload file"
|
||||||
|
msgstr "Lataa tiedosto"
|
||||||
|
|
||||||
|
#: .\members\templates\member_add_many.html:37
|
||||||
msgid "Payment source"
|
msgid "Payment source"
|
||||||
msgstr "Maksutapa"
|
msgstr "Maksutapa"
|
||||||
|
|
||||||
#: .\members\templates\member_add_many.html:37
|
#: .\members\templates\member_add_many.html:41
|
||||||
msgid "Cash payment"
|
msgid "Cash payment"
|
||||||
msgstr "Käteismaksu"
|
msgstr "Käteismaksu"
|
||||||
|
|
||||||
#: .\members\templates\member_add_many.html:41
|
#: .\members\templates\member_add_many.html:44
|
||||||
|
msgid ""
|
||||||
|
"This payment source will be used to create any payments for new members that "
|
||||||
|
"already exist in the database."
|
||||||
|
msgstr ""
|
||||||
|
"Tätä maksutapaa käytetään, kun jo tietokannassa oleville jäsenille luodaan "
|
||||||
|
"maksutapahtuma."
|
||||||
|
|
||||||
|
#: .\members\templates\member_add_many.html:48
|
||||||
msgid "CSV delimiter"
|
msgid "CSV delimiter"
|
||||||
msgstr "CSV-erotin"
|
msgstr "CSV-erotin"
|
||||||
|
|
||||||
#: .\members\templates\member_add_many.html:44
|
#: .\members\templates\member_add_many.html:51
|
||||||
msgid ""
|
msgid ""
|
||||||
"The symbol that is used to separate items in one line. Defaults to "
|
"The symbol that is used to separate items in one line. Defaults to "
|
||||||
"';' (semicolon)."
|
"';' (semicolon)."
|
||||||
@@ -470,11 +478,11 @@ msgstr "Maksutapahtumia:"
|
|||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Kieli"
|
msgstr "Kieli"
|
||||||
|
|
||||||
#: .\members\templates\settings.html:20 .\sikweb\base.py:222
|
#: .\members\templates\settings.html:20 .\sikweb\base.py:226
|
||||||
msgid "Finnish"
|
msgid "Finnish"
|
||||||
msgstr "suomi"
|
msgstr "suomi"
|
||||||
|
|
||||||
#: .\members\templates\settings.html:21 .\sikweb\base.py:223
|
#: .\members\templates\settings.html:21 .\sikweb\base.py:227
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr "englanti"
|
msgstr "englanti"
|
||||||
|
|
||||||
@@ -561,9 +569,9 @@ msgstr "Onnistuneesti päivitettiin maksutapahtuma"
|
|||||||
msgid "Could not update payment object"
|
msgid "Could not update payment object"
|
||||||
msgstr "Maksutapahtumaobjektia ei voitu päivittää"
|
msgstr "Maksutapahtumaobjektia ei voitu päivittää"
|
||||||
|
|
||||||
#: .\members\views\utils.py:117
|
#: .\members\views\utils.py:121
|
||||||
msgid "Missing \"textfield\" POST request field"
|
msgid "Missing CSV file"
|
||||||
msgstr "Puuttuva \"textfield\" POST-kenttä"
|
msgstr "Puuttuva CSV-tiedosto"
|
||||||
|
|
||||||
#: .\templates\admin\base_site.html:43
|
#: .\templates\admin\base_site.html:43
|
||||||
msgid "Go"
|
msgid "Go"
|
||||||
@@ -577,7 +585,7 @@ msgstr "Virhe"
|
|||||||
msgid "Back"
|
msgid "Back"
|
||||||
msgstr "Takaisin"
|
msgstr "Takaisin"
|
||||||
|
|
||||||
#: .\templates\footer.html:23
|
#: .\templates\footer.html:23 .\webapp\templates\kaehmy_footer.html:23
|
||||||
msgid "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
|
msgid "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
|
||||||
msgstr "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
|
msgstr "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
|
||||||
|
|
||||||
@@ -831,7 +839,7 @@ msgstr "Telegram-kanavat"
|
|||||||
msgid "SIK Admin"
|
msgid "SIK Admin"
|
||||||
msgstr "SIK Hallintapaneeli"
|
msgstr "SIK Hallintapaneeli"
|
||||||
|
|
||||||
#: .\webapp\templates\base.html:15
|
#: .\webapp\templates\base.html:15 .\webapp\templates\kaehmy_base.html:14
|
||||||
msgid "Aalto-yliopiston Sähköinsinöörikilta ry"
|
msgid "Aalto-yliopiston Sähköinsinöörikilta ry"
|
||||||
msgstr "Aalto-yliopiston Sähköinsinöörikilta ry"
|
msgstr "Aalto-yliopiston Sähköinsinöörikilta ry"
|
||||||
|
|
||||||
@@ -1023,5 +1031,28 @@ msgstr "Kaikki haasteet"
|
|||||||
msgid "Total challenges:"
|
msgid "Total challenges:"
|
||||||
msgstr "Haasteita yhteensä:"
|
msgstr "Haasteita yhteensä:"
|
||||||
|
|
||||||
|
#~ msgid ""
|
||||||
|
#~ "\n"
|
||||||
|
#~ " first_name, last_name, email_address and place_of_origin "
|
||||||
|
#~ "should be given string values.\n"
|
||||||
|
#~ " ayy_member and jas_recipient should be given the value 0 "
|
||||||
|
#~ "(off) or 1 (on).\n"
|
||||||
|
#~ " "
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "\n"
|
||||||
|
#~ " first_name, last_name, email_address ja place_of_origin ovat "
|
||||||
|
#~ "merkkijonoja.\n"
|
||||||
|
#~ " ayy_member ja jas_recipient ovat joko 0 (off) tai 1 (on).\n"
|
||||||
|
#~ " "
|
||||||
|
|
||||||
|
#~ msgid "Syntax"
|
||||||
|
#~ msgstr "Syntaksi"
|
||||||
|
|
||||||
|
#~ msgid "Data"
|
||||||
|
#~ msgstr "Data"
|
||||||
|
|
||||||
|
#~ msgid "Missing \"textfield\" POST request field"
|
||||||
|
#~ msgstr "Puuttuva \"textfield\" POST-kenttä"
|
||||||
|
|
||||||
#~ msgid "Applied for board"
|
#~ msgid "Applied for board"
|
||||||
#~ msgstr "Hakenut hallitukseen"
|
#~ msgstr "Hakenut hallitukseen"
|
||||||
|
|||||||
+5
-1
@@ -46,7 +46,7 @@ class MemberForm(forms.ModelForm):
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def csv_to_models(data, payment_source='AYY', delimiter=','):
|
def csv_to_models(data, payment_source='AYY', delimiter=','):
|
||||||
clean_data = data.strip().split('\n')
|
clean_data = data.strip().split('\n')
|
||||||
clean_data = [row.rstrip(',') for row in clean_data]
|
clean_data = [row.rstrip(',').rstrip('\r').strip() for row in clean_data]
|
||||||
csv_reader = csv.DictReader(clean_data, fieldnames=MemberForm.Meta.fields, delimiter=delimiter, quoting=csv.QUOTE_NONE)
|
csv_reader = csv.DictReader(clean_data, fieldnames=MemberForm.Meta.fields, delimiter=delimiter, quoting=csv.QUOTE_NONE)
|
||||||
|
|
||||||
members = []
|
members = []
|
||||||
@@ -122,3 +122,7 @@ class ApplicationForm(forms.ModelForm):
|
|||||||
|
|
||||||
self.fields['AYY'].label = _("I'm a member of AYY")
|
self.fields['AYY'].label = _("I'm a member of AYY")
|
||||||
self.fields['jas'].label = _("I want to receive a weekly newsletter")
|
self.fields['jas'].label = _("I want to receive a weekly newsletter")
|
||||||
|
|
||||||
|
|
||||||
|
class UploadFileForm(forms.Form):
|
||||||
|
file = forms.FileField()
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
from import_export import resources
|
||||||
|
|
||||||
|
from .models import Member, Payment, Request
|
||||||
|
|
||||||
|
|
||||||
|
class MemberResource(resources.ModelResource):
|
||||||
|
class Meta:
|
||||||
|
model = Member
|
||||||
|
exclude = ['id', 'created']
|
||||||
|
|
||||||
|
|
||||||
|
class PaymentResource(resources.ModelResource):
|
||||||
|
member = resources.Field()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Payment
|
||||||
|
exclude = ['id']
|
||||||
|
|
||||||
|
def dehydrate_member(self, payment):
|
||||||
|
return '{} {}'.format(payment.member.first_name, payment.member.last_name)
|
||||||
|
|
||||||
|
|
||||||
|
class ApplicationResource(resources.ModelResource):
|
||||||
|
class Meta:
|
||||||
|
model = Request
|
||||||
|
exclude = ['id']
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 5.7 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 5.0 KiB |
@@ -15,6 +15,10 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{{ table|safe }}
|
{{ table|safe }}
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<a href="/members/export_applications" class="btn btn-info">{% trans "Download Excel" %}</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{% extends "members_base.html" %}
|
{% extends "members_base.html" %}
|
||||||
|
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
{% load static %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
@@ -11,24 +11,28 @@
|
|||||||
<div>
|
<div>
|
||||||
<p>
|
<p>
|
||||||
{% blocktrans %}
|
{% blocktrans %}
|
||||||
Enter member information in CSV format, separate members on separate lines.
|
Enter member information in CSV format, separate members on separate lines.
|
||||||
|
If a new member already exists in the database, a new payment event will be created for that member instead.
|
||||||
{% endblocktrans %}
|
{% endblocktrans %}
|
||||||
</p>
|
</p>
|
||||||
<p>
|
|
||||||
{% blocktrans %}
|
|
||||||
first_name, last_name, email_address and place_of_origin should be given string values.
|
|
||||||
ayy_member and jas_recipient should be given the value 0 (off) or 1 (on).
|
|
||||||
{% endblocktrans %}
|
|
||||||
</p>
|
|
||||||
<h4>{% trans "Syntax" %}</h4>
|
|
||||||
<pre>first_name, last_name, email_address, place_of_origin, ayy_member, jas_recipient</pre>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<form name="memberTextForm" action="/members/import_csv" method="POST">{% csrf_token %}
|
|
||||||
<div class="form-group">
|
<div>
|
||||||
<label>{% trans "Data" %}</label>
|
<label>{% trans "Format the member table like this:" %}</label>
|
||||||
<textarea name="textfield" class="form-control large-textarea" placeholder="Teemu, Teekkari, teemu.teekkari@notmail.dom, Otaniemi, 0, 0"></textarea>
|
<div>
|
||||||
|
<img src="{% static "img/excel_csv_save_example.png" %}">
|
||||||
</div>
|
</div>
|
||||||
|
<p>{% blocktrans %}Columns: First name, last name, email address, place of origin, AYY member, JAS recipient{% endblocktrans %}</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label>{% trans "Save the file as CSV" %}</label>
|
||||||
|
<div><img src="{% static "img/excel_csv_save_tutorial.png" %}"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form name="memberTextForm" action="/members/import_csv" enctype="multipart/form-data" method="POST">{% csrf_token %}
|
||||||
|
<h3>{% trans "Upload file" %}</h3>
|
||||||
|
<input class="form-control-file" type="file" name="csvFile" />
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>{% trans "Payment source" %}</label>
|
<label>{% trans "Payment source" %}</label>
|
||||||
<select name="payment_source" class="form-control">
|
<select name="payment_source" class="form-control">
|
||||||
@@ -36,13 +40,16 @@
|
|||||||
<option value="bank_transfer">{% trans "Bank transfer" %}</option>
|
<option value="bank_transfer">{% trans "Bank transfer" %}</option>
|
||||||
<option value="cash">{% trans "Cash payment" %}</option>
|
<option value="cash">{% trans "Cash payment" %}</option>
|
||||||
</select>
|
</select>
|
||||||
|
<small class="form-text text-muted">
|
||||||
|
{% trans "This payment source will be used to create any payments for new members that already exist in the database." %}
|
||||||
|
</small>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>{% trans "CSV delimiter" %}</label>
|
<label>{% trans "CSV delimiter" %}</label>
|
||||||
<input type="text" name="delimiter" class="form-control" value=";" />
|
<input type="text" name="delimiter" class="form-control" value=";" />
|
||||||
<p class="form-text text-muted">
|
<small class="form-text text-muted">
|
||||||
{% blocktrans %}The symbol that is used to separate items in one line. Defaults to ';' (semicolon).{% endblocktrans %}
|
{% blocktrans %}The symbol that is used to separate items in one line. Defaults to ';' (semicolon).{% endblocktrans %}
|
||||||
</p>
|
</small>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<button type="submit" class="btn btn-primary">{% trans "Send" %}</button>
|
<button type="submit" class="btn btn-primary">{% trans "Send" %}</button>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{% extends "members_base.html" %}
|
{% extends "members_base.html" %}
|
||||||
|
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load bootstrap3 %}
|
{% load bootstrap4 %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
{{ table|safe }}
|
{{ table|safe }}
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<a href="/members/export_csv" class="btn btn-info">{% trans "Download CSV" %}</a>
|
<a href="/members/export_members" class="btn btn-info">{% trans "Download Excel" %}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|||||||
@@ -36,5 +36,9 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{{ table|safe }}
|
{{ table|safe }}
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<a href="/members/export_payments" class="btn btn-info">{% trans "Download Excel" %}</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{% extends "members_base.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1>{{ title }}</h1>
|
||||||
|
<h3>{{ header }}</h3>
|
||||||
|
<form method="POST" action="/members/import_excel" enctype="multipart/form-data">{% csrf_token %}
|
||||||
|
{{ form }}
|
||||||
|
<input type="submit" class="btn btn-primary">
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
||||||
+8
-3
@@ -7,7 +7,7 @@ from django.views.generic.base import RedirectView
|
|||||||
# members
|
# members
|
||||||
from members.views import member_list, payment_add, payment_submit
|
from members.views import member_list, payment_add, payment_submit
|
||||||
from members.views import application_delete_confirm, application_delete
|
from members.views import application_delete_confirm, application_delete
|
||||||
from members.views import application_accept, import_csv, export_csv
|
from members.views import application_accept, import_csv
|
||||||
from members.views import settings_page, payment_edit
|
from members.views import settings_page, payment_edit
|
||||||
from members.views import payment_delete_confirm
|
from members.views import payment_delete_confirm
|
||||||
from members.views import payment_delete, payment_update
|
from members.views import payment_delete, payment_update
|
||||||
@@ -20,6 +20,9 @@ from members.views import member_delete_confirm
|
|||||||
from members.views import member_delete
|
from members.views import member_delete
|
||||||
from members.views import payment_list
|
from members.views import payment_list
|
||||||
from members.views import add_many_confirm
|
from members.views import add_many_confirm
|
||||||
|
from members.views import export_members_excel
|
||||||
|
from members.views import export_payments_excel
|
||||||
|
from members.views import export_applications_excel
|
||||||
|
|
||||||
# autocomplete view
|
# autocomplete view
|
||||||
from members.views import MemberAutoComplete
|
from members.views import MemberAutoComplete
|
||||||
@@ -108,8 +111,10 @@ urlpatterns = [
|
|||||||
# send CSV member data by POST
|
# send CSV member data by POST
|
||||||
url(r'^import_csv', import_csv),
|
url(r'^import_csv', import_csv),
|
||||||
|
|
||||||
# download CSV member data
|
# export members as excel file
|
||||||
url(r'^export_csv', export_csv),
|
url(r'export_members', export_members_excel),
|
||||||
|
url(r'export_payments', export_payments_excel),
|
||||||
|
url(r'export_applications', export_applications_excel),
|
||||||
|
|
||||||
# favourite icon
|
# favourite icon
|
||||||
url(r'^favicon\.ico$', favicon_view),
|
url(r'^favicon\.ico$', favicon_view),
|
||||||
|
|||||||
+31
-25
@@ -2,7 +2,7 @@ from django.shortcuts import render
|
|||||||
from django.contrib.auth.decorators import permission_required, login_required
|
from django.contrib.auth.decorators import permission_required, login_required
|
||||||
from django.views.decorators.http import require_http_methods
|
from django.views.decorators.http import require_http_methods
|
||||||
from django.views.decorators.csrf import ensure_csrf_cookie
|
from django.views.decorators.csrf import ensure_csrf_cookie
|
||||||
from django.http import HttpResponse, HttpResponseRedirect
|
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseBadRequest
|
||||||
from django.core.mail import send_mail
|
from django.core.mail import send_mail
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
@@ -20,8 +20,9 @@ from rest_framework import generics
|
|||||||
from rest_framework import permissions
|
from rest_framework import permissions
|
||||||
|
|
||||||
from members.models import Member, Request, Payment
|
from members.models import Member, Request, Payment
|
||||||
from members.forms import MemberForm, PaymentForm, ApplicationForm, CSVValidationError
|
from members.forms import MemberForm, PaymentForm, ApplicationForm, CSVValidationError, UploadFileForm
|
||||||
from members.tables import MemberTable, PaymentTable, RequestTable
|
from members.tables import MemberTable, PaymentTable, RequestTable
|
||||||
|
from members.resources import MemberResource, PaymentResource, ApplicationResource
|
||||||
|
|
||||||
|
|
||||||
# Can be used to retrieve single member information via REST API
|
# Can be used to retrieve single member information via REST API
|
||||||
@@ -108,13 +109,16 @@ def settings_page(request, *args, **kwargs):
|
|||||||
def import_csv(request, *args, **kwargs):
|
def import_csv(request, *args, **kwargs):
|
||||||
"""Get csv data imported to page and create members based on that."""
|
"""Get csv data imported to page and create members based on that."""
|
||||||
try:
|
try:
|
||||||
data = request.POST['textfield']
|
csv_in_memory_file = request.FILES.get('csvFile')
|
||||||
|
csv_file = csv_in_memory_file.file
|
||||||
|
data = csv_file.read().decode('utf-8')
|
||||||
|
|
||||||
delimiter = request.POST.get('delimiter', ',')
|
delimiter = request.POST.get('delimiter', ',')
|
||||||
payment_source = request.POST['payment_source']
|
payment_source = request.POST['payment_source']
|
||||||
except:
|
except:
|
||||||
return render(request,
|
return render(request,
|
||||||
'error.html',
|
'error.html',
|
||||||
{'error': _('Missing "textfield" POST request field')})
|
{'error': _('Missing CSV file')})
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = MemberForm.csv_to_models(data, payment_source=payment_source, delimiter=delimiter)
|
result = MemberForm.csv_to_models(data, payment_source=payment_source, delimiter=delimiter)
|
||||||
@@ -149,27 +153,6 @@ def import_csv(request, *args, **kwargs):
|
|||||||
return render(request, 'member_add_many_confirm.html', context)
|
return render(request, 'member_add_many_confirm.html', context)
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
|
||||||
@require_http_methods(["GET"])
|
|
||||||
@permission_required('members.read_member', login_url='/login', raise_exception=True)
|
|
||||||
def export_csv(request, *args, **kwargs):
|
|
||||||
"""Export members as csv."""
|
|
||||||
response = HttpResponse()
|
|
||||||
response['Content-type'] = 'text/csv'
|
|
||||||
response['Accept'] = 'text/csv'
|
|
||||||
response['Content-Disposition'] = 'filename; filename=members.csv'
|
|
||||||
writer = csv.writer(response, csv.excel)
|
|
||||||
# BOM (optional...Excel needs it to open UTF-8 file properly)
|
|
||||||
response.write(u'\ufeff'.encode('utf8'))
|
|
||||||
for obj in Member.objects.all():
|
|
||||||
data = obj.as_array()
|
|
||||||
field_list = list(map(lambda d: str(d), data))
|
|
||||||
|
|
||||||
writer.writerow(field_list)
|
|
||||||
|
|
||||||
return response
|
|
||||||
|
|
||||||
|
|
||||||
def send_mail_wrapper(subject, message, email_to):
|
def send_mail_wrapper(subject, message, email_to):
|
||||||
"""Send mail to default email."""
|
"""Send mail to default email."""
|
||||||
send_mail(subject,
|
send_mail(subject,
|
||||||
@@ -177,3 +160,26 @@ def send_mail_wrapper(subject, message, email_to):
|
|||||||
settings.DEFAULT_EMAIL_FROM,
|
settings.DEFAULT_EMAIL_FROM,
|
||||||
[email_to],
|
[email_to],
|
||||||
fail_silently=False)
|
fail_silently=False)
|
||||||
|
|
||||||
|
|
||||||
|
def make_excel_response(Resource):
|
||||||
|
res = Resource()
|
||||||
|
dataset = res.export()
|
||||||
|
response = HttpResponse(dataset.xlsx, content_type='application/vnd.ms-excel; charset=utf-8')
|
||||||
|
response['Content-Disposition'] = 'attachment; filename="export.xlsx"'
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
@require_http_methods(['GET'])
|
||||||
|
def export_members_excel(request, *args, **kwargs):
|
||||||
|
return make_excel_response(MemberResource)
|
||||||
|
|
||||||
|
|
||||||
|
@require_http_methods(['GET'])
|
||||||
|
def export_payments_excel(request, *args, **kwargs):
|
||||||
|
return make_excel_response(PaymentResource)
|
||||||
|
|
||||||
|
|
||||||
|
@require_http_methods(['GET'])
|
||||||
|
def export_applications_excel(request, *args, **kwargs):
|
||||||
|
return make_excel_response(ApplicationResource)
|
||||||
|
|||||||
@@ -30,3 +30,5 @@ django-autocomplete-light==3.2.10
|
|||||||
six==1.10.0
|
six==1.10.0
|
||||||
django-suit==0.2.25
|
django-suit==0.2.25
|
||||||
telepot==12.3
|
telepot==12.3
|
||||||
|
django-excel==0.0.9
|
||||||
|
pyexcel-xls==0.5.2
|
||||||
@@ -82,11 +82,15 @@ INSTALLED_APPS = [
|
|||||||
'rest_framework',
|
'rest_framework',
|
||||||
'django_nose',
|
'django_nose',
|
||||||
'bootstrap3',
|
'bootstrap3',
|
||||||
|
'bootstrap4',
|
||||||
'django_tables2',
|
'django_tables2',
|
||||||
'auditlog',
|
'auditlog',
|
||||||
'phonenumber_field',
|
'phonenumber_field',
|
||||||
|
'import_export',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
IMPORT_EXPORT_USE_TRANSACTIONS = True
|
||||||
|
|
||||||
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
|
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
|
||||||
|
|
||||||
NOSE_ARGS = [
|
NOSE_ARGS = [
|
||||||
@@ -255,6 +259,10 @@ MEDIA_URL = '/media/'
|
|||||||
LOGIN_URL = '/login/'
|
LOGIN_URL = '/login/'
|
||||||
LOGIN_REDIRECT_URL = '/admin'
|
LOGIN_REDIRECT_URL = '/admin'
|
||||||
|
|
||||||
|
# for django-excel
|
||||||
|
FILE_UPLOAD_HANDLERS = ("django_excel.ExcelMemoryFileUploadHandler",
|
||||||
|
"django_excel.TemporaryExcelFileUploadHandler")
|
||||||
|
|
||||||
SUIT_CONFIG = {
|
SUIT_CONFIG = {
|
||||||
# header
|
# header
|
||||||
'ADMIN_NAME': 'SIK Admin',
|
'ADMIN_NAME': 'SIK Admin',
|
||||||
|
|||||||
Reference in New Issue
Block a user