Compare commits

..

1351 Commits

Author SHA1 Message Date
klmp200 2480644f1c Merge branch 'eboutic_check_basket_amount' into 'master'
eboutic: check basket amount upon command validation

See merge request ae/Sith!192
2019-03-15 12:18:05 +01:00
Skia 03eeffdea0 eboutic: check basket amount upon command validation 2019-03-15 02:17:36 +01:00
klmp200 d56990b91f Merge branch 'fix/better_str_comparison' into 'master'
small fix to follow python recommendations

See merge request ae/Sith!190
2019-02-04 00:10:02 +01:00
krophil 18f464a49f small fix to follow python recommendations 2019-02-02 00:32:34 +01:00
klmp200 0f7f80e9d3 Merge branch 'makdown-editor' into 'master'
Workaround for crsf token in production for MarkdownInput

See merge request ae/Sith!189
2018-12-20 18:36:05 +01:00
klmp200 d2c5908c89 core: workaround for crsf token in production for MarkdownInput
See https://docs.djangoproject.com/en/2.0/ref/csrf/#acquiring-the-token-if-csrf-use-sessions-is-true
2018-12-20 18:19:50 +01:00
Skia 3898a13b25 Merge branch 'makdown-editor' into 'master'
Add a nice markdown editor

See merge request ae/Sith!184
2018-12-20 17:11:43 +01:00
klmp200 3dda8eafc4 elections: use MarkdownInput for CandidateForm 2018-12-20 16:43:59 +01:00
klmp200 dc800b59f4 com: use MarkdownInput for alert_msg, info_msg and index_page editing 2018-12-20 15:13:59 +01:00
klmp200 24dd258d0a com: use MarkdownInput on news 2018-12-20 15:09:44 +01:00
klmp200 d2021ecf7e com: use MarkdownInput for weekmail 2018-12-20 15:06:20 +01:00
klmp200 d53d725415 core: fix validation error on generic create view with MarkdownInput 2018-12-20 15:03:41 +01:00
klmp200 f6ab993b8d wiki: remove old markdown preview 2018-12-20 14:32:52 +01:00
klmp200 bae45bcd38 forum: remove old markdown preview 2018-12-20 14:27:55 +01:00
klmp200 fdfe33dedc core: remove old markdown editor 2018-12-20 14:20:58 +01:00
klmp200 8111ae107a core: move centralized custom scripts on top of base.jinja and move getCookie inside 2018-12-20 14:15:57 +01:00
klmp200 97b06b160b core: add delay on live preview for MarkdownInput to avoid making too much request to the API 2018-12-20 14:06:30 +01:00
klmp200 19c1361e47 core: fix heading in MarkdownInput 2018-12-19 14:10:39 +01:00
klmp200 542a2ede32 core: translations for MarkdownInupt 2018-12-19 14:02:45 +01:00
klmp200 ea538dbab3 core: handle all basic editing actions in MarkdownInput 2018-12-19 12:25:59 +01:00
klmp200 d0771f3e2a Merge branch 'contribution-instructions' into 'master'
Fix contributing and readme

See merge request ae/Sith!186
2018-12-19 00:03:04 +01:00
klmp200 80248ec8d3 Merge branch 'patch/targets' into 'master'
Avoid error 500 when target is forgotten

See merge request ae/Sith!187
2018-12-19 00:02:25 +01:00
krophil 8388f4ee65 Avoid error 500 when target is forgotten 2018-12-18 23:50:24 +01:00
klmp200 27500a7820 Fix contributing and readme 2018-12-18 23:16:39 +01:00
klmp200 55ff492ec8 core: edit buttons on MarkdownInupt 2018-12-18 14:39:05 +01:00
klmp200 3b08603635 core: avoid inserting automatic whitespace in MarkdownInput 2018-12-18 14:13:15 +01:00
klmp200 4d866843e1 core: move jquery to header section 2018-12-18 13:54:53 +01:00
klmp200 4afd7a0023 core: avoid blinking in MarkdownInput preview 2018-12-14 18:02:01 +01:00
klmp200 d6f08d3706 core: use pure js to get cookie in markdown input 2018-12-14 17:53:25 +01:00
klmp200 775f456c40 core: introduce new markdown input
To fix
* Avoid blinking in preview
* Don't insert stupid space on empty textarea
2018-12-14 16:24:11 +01:00
Skia acfbdd1ad5 Merge branch 'feature/forum-search' into 'master'
Forum search

See merge request ae/Sith!181
2018-12-13 20:57:01 +01:00
Skia 835782fd7e forum/views: reduce number of queries with some 'prefetch_related' 2018-12-13 20:36:21 +01:00
Skia 82df424146 core: put User.group's names in cache 2018-12-13 20:36:21 +01:00
klmp200 af3e2fb951 forum: use generic macro to display breadcrumb and display it on search result 2018-12-13 20:33:34 +01:00
klmp200 84811af9f1 forum: fix translation when no search result found 2018-12-13 20:33:34 +01:00
klmp200 82ffd75372 forum: fix typo in search bar checkbox class name 2018-12-13 20:33:34 +01:00
klmp200 068a80519c forum: fix order by date 2018-12-13 20:33:34 +01:00
klmp200 fc7e45190d forum: use pure jinja for search bar 2018-12-13 20:33:34 +01:00
klmp200 6891174935 forum: implement order by date for search 2018-12-13 20:33:34 +01:00
klmp200 721b22a1e9 forum: improve search bar UX behavior 2018-12-13 20:33:34 +01:00
klmp200 e421a2b4cd forum: increase search speed by optimizing permission filter 2018-12-13 20:33:34 +01:00
Soldat a9bae46f45 changed design 2018-12-13 20:33:34 +01:00
klmp200 57454bffa0 forum: workaround size error while building index, handle malformed utf8 2018-12-13 20:33:34 +01:00
klmp200 641d564ec6 forum: add trigger to update index on ForumMessage update 2018-12-13 20:33:34 +01:00
klmp200 ee99ec1aed forum: workaround for building index with safety margin 2018-12-13 20:33:34 +01:00
klmp200 269242601a forum: workaround for error while indexing badly encoded text (legacy) 2018-12-13 20:33:34 +01:00
klmp200 545671bec3 forum: workaround for building index 2018-12-13 20:33:34 +01:00
klmp200 347caa3b6a forum and core: fix error 500 when query is empty on search 2018-12-13 20:33:34 +01:00
klmp200 65a0b7b2d4 forum: better display of search results 2018-12-13 20:33:34 +01:00
klmp200 107c6c196f forum: limit results and improve search engine speed 2018-12-13 20:33:34 +01:00
klmp200 884855c178 forum and core: remove CanViewSearchMixin and use specialized view instead 2018-12-13 20:33:34 +01:00
klmp200 1de77f2fdd core: fix typo 2018-12-13 20:33:34 +01:00
klmp200 076b10e325 forum and core: add a dedicated mixin to exclude unauthorized search results 2018-12-13 20:33:34 +01:00
klmp200 3fdb83c1c2 forum and core: add access rights on search query 2018-12-13 20:33:34 +01:00
klmp200 525b047b4f forum: display search bar on every forum pages 2018-12-13 20:33:34 +01:00
klmp200 404b825de4 forum: make search fuzzy 2018-12-13 20:33:34 +01:00
klmp200 286ba91c75 Adapt forum search to xapian and improve query 2018-12-13 20:33:34 +01:00
Grégoire Duvauchelle 9b8a881914 Add haystack index, and a view for forum search (WIP) 2018-12-13 20:33:34 +01:00
Skia a96aeba1fa Merge branch 'contribution-instructions' into 'master'
Update contributing and readme to xapian dependency

See merge request ae/Sith!183
2018-12-06 00:13:17 +01:00
klmp200 824060bc7a Update contributing and readme to xapian dependency 2018-12-05 23:26:42 +01:00
Skia aba4207423 core: improve search index with 'autocomplete' 2018-12-05 14:59:14 +01:00
Skia 65e0b15b31 Update Haystack indexer to use Xapian 2018-11-26 21:25:02 +01:00
klmp200 c071ed66bc Merge branch 'contribution-instructions' into 'master'
Add team chat badge into README.md

See merge request ae/Sith!178
2018-11-08 22:54:23 +01:00
klmp200 c42450ee2f Add team chat badge into README.md 2018-11-08 21:29:02 +01:00
klmp200 6355bad5b7 Merge branch 'ergonomie' into 'master'
Navbar translation improvements

See merge request ae/Sith!177
2018-11-08 00:39:14 +01:00
klmp200 2c61e797c6 Navbar translation improvements 2018-11-08 00:27:50 +01:00
Soldat c2d92eb114 Merge branch 'ergonomie' into 'master'
Change nav tab

See merge request ae/Sith!176
2018-11-07 23:17:27 +01:00
Soldat 2707b5b1f2 changed color adn local 2018-11-06 00:56:16 +01:00
Soldat aa8a514bf8 changed locale 2 2018-11-06 00:34:48 +01:00
Soldat b5b36e5d1c Changed local 2018-11-06 00:14:40 +01:00
Soldat 6baac88e63 format css correctly 2018-11-05 23:57:37 +01:00
Soldat 49d3123ad8 Changed tab v2 2018-11-05 23:57:37 +01:00
Soldat 29935cb5a8 Add dropdown in navtab 2018-11-05 23:57:37 +01:00
Soldat 3dc73ebb9a Change nav tab 2018-11-05 23:57:37 +01:00
Soldat ca4e23fbb1 add phonenumbers in requirements 2018-11-05 23:56:32 +01:00
Soldat 39c41f916d Merge branch 'il-faut-sauver-le-css' into 'master'
Message change color when unread

See merge request ae/Sith!171
2018-10-17 06:15:42 +02:00
Soldat bf321aaac3 Message change color when unread 2018-10-16 21:08:47 +02:00
klmp200 75dd171714 Merge branch 'historique_cotisations' into 'master'
user: allow subscription history to be visible when subscription is expired

See merge request ae/Sith!169
2018-10-16 15:43:23 +02:00
klmp200 4d3ff3e9dc user: allow subscription history to be visible when subscription is expired 2018-10-16 15:28:45 +02:00
klmp200 917b559b4a Merge branch 'historique_cotisations' into 'master'
user: add subscription history

See merge request ae/Sith!167
2018-10-16 15:17:57 +02:00
klmp200 9089fe3a6a Merge branch 'formulaire_cotisation' into 'master'
subscriptions: add date_of_birth for new users created in subscription form

See merge request ae/Sith!168
2018-10-16 15:01:25 +02:00
klmp200 72a4bde6a2 user: fix populate for dev and use native django function to fetch payment_method 2018-10-16 14:52:47 +02:00
klmp200 e24eb8ce37 subscriptions: add date_of_birth for new users created in subscription form 2018-10-16 00:44:32 +02:00
klmp200 f6968facbe user: add subscription history 2018-10-16 00:17:19 +02:00
klmp200 b2b03e530a Merge branch 'sentry' into 'master'
senrty: fix SENTRY_DSN in error page

See merge request ae/Sith!166
2018-10-10 16:40:57 +02:00
klmp200 f91ba25b25 senrty: fix SENTRY_DSN in error page 2018-10-10 16:33:12 +02:00
klmp200 6fd34bcaa0 Merge branch 'sentry' into 'master'
Intégration d'une page d'incident automatique

See merge request ae/Sith!165
2018-10-10 16:23:05 +02:00
klmp200 f4122bbc37 sentry: deal with sentry's js as external resource 2018-10-10 15:27:21 +02:00
Soldat e44c8bf828 Merge branch 'il-faut-sauver-le-css' into 'master'
Change design

See merge request ae/Sith!163
2018-10-10 10:13:49 +02:00
klmp200 bdd8427758 sentry: integration with error 500 page 2018-10-10 02:18:19 +02:00
Soldat 87b70d4597 Changed color 2018-10-09 22:04:17 +02:00
Soldat 20b513a381 Decrease nav and agenda border radius, change shadow, change tool bar border and margin 2018-10-09 22:04:17 +02:00
Soldat 680d29a2b4 Darker nav color 2018-10-09 22:04:17 +02:00
klmp200 f7be284b30 Merge branch 'sentry' into 'master'
Support de sentry pour récupérer les erreurs utilisateur

See merge request ae/Sith!161
2018-10-09 12:14:50 +02:00
Soldat 3ae0c3f3e1 Merge branch 'il-faut-sauver-le-css' into 'master'
Changed the design of the Sith.

See merge request ae/Sith!162
2018-10-07 22:21:12 +02:00
Soldat cce33d13b3 Change hex to hsl 2018-10-07 21:48:03 +02:00
Soldat a78f1101c3 Changed site design v1 2018-10-07 21:48:03 +02:00
Soldat 3a778e2105 First commit and fix overlapping text and logo 2018-10-07 14:59:04 +02:00
klmp200 b2d44e83b4 debug: add sentry support 2018-10-06 03:37:36 +02:00
Soldat a88430d43b Merge branch 'black' into 'master'
Passer black sur tout le repo et l'imposer

See merge request ae/Sith!159
2018-10-05 23:26:57 +02:00
klmp200 d2fe9e56cf Add black for sublime text in contributing 2018-10-05 23:18:35 +02:00
Soldat 66957750ba Ajout de black dans contributing 2018-10-05 23:03:45 +02:00
klmp200 d56a5138a8 contributing: freshen up infos while I'm at it 2018-10-05 22:30:54 +02:00
klmp200 839f585f87 CI: improve CI 2018-10-05 21:53:14 +02:00
klmp200 cb58b00b6e All: Apply Black coding rules 2018-10-05 21:52:55 +02:00
klmp200 0581c667de Club: blackify view file 2018-10-05 21:51:54 +02:00
klmp200 88d6f8dc8a CI: introduce black 2018-10-05 21:48:26 +02:00
Soldat d1d1ba4aff Merge branch 'clubs' into 'master'
clubs: un champ plus joli pour la short_description, crack vas être content

See merge request ae/Sith!158
2018-10-05 21:41:21 +02:00
klmp200 5a6c7aaadf clubs: un champ plus joli pour la short_description, crack vas être content 2018-10-04 00:15:47 +02:00
Soldat 9a9eb52768 Merge branch 'cotiz' into 'master'
add 1 day cotiz

See merge request ae/Sith!157
2018-09-20 19:28:04 +02:00
Soldat cd7672f08c Change local for one day cotiz 2018-09-20 14:48:40 +02:00
Soldat 2fca548e15 Add 1 day cotiz 2018-09-20 14:30:35 +02:00
Skia be36b7f38a com: fix birthdays query 2018-09-19 11:37:16 +02:00
krophil 09bde1bfdf Merge branch 'cotiz' into 'master'
added 6 month free cotiz and changed compute_end

See merge request ae/Sith!156
2018-09-01 18:42:13 +02:00
Soldat 7a1b9bd412 compute_end count day by day now (not month by month like before) to allow 6 weeks cotiz 2018-09-01 17:45:13 +02:00
Soldat f78d8e1d95 change sub 2 month free to 6 weeks free 2018-08-31 18:41:06 +02:00
klmp200 bef10c0fe3 Merge branch 'sli' into 'master'
Add subscription for 2018 Euroks

See merge request ae/Sith!155
2018-07-07 00:19:22 +02:00
klmp200 e3cb6d41f9 Add subscription for 2018 Euroks 2018-07-07 00:13:31 +02:00
Skia 290f6ca883 Merge branch 'feature/captcha' into 'master'
Add captcha to registration form

Closes #52

See merge request ae/Sith!154
2018-07-06 11:35:03 +02:00
Grégoire Duvauchelle afe78ea634 Add captcha to registration form 2018-07-06 11:35:02 +02:00
klmp200 b2abc78694 Merge branch 'new_django' into 'master'
Fix subscription bug for old subscribers on subscription page

See merge request ae/Sith!153
2018-06-12 15:07:09 +02:00
klmp200 f1e8d55b41 Fix subscription bug for old subscribers on subscription page 2018-06-12 15:00:51 +02:00
klmp200 7322882002 Merge branch 'new_django' into 'master'
Fix user pictures display

See merge request ae/Sith!152
2018-06-10 18:49:44 +02:00
klmp200 5c4a16d14c Fix user pictures display 2018-06-10 18:43:39 +02:00
klmp200 1cfc4f8092 Merge branch 'new_django' into 'master'
Migration to django 1.11

See merge request ae/Sith!146
2018-06-10 16:37:57 +02:00
klmp200 08de5dfe6a Migration to django 1.11 2018-06-10 16:31:58 +02:00
klmp200 39119f586a Merge branch 'sli' into 'master'
Image promo 19 et demande du bdf

See merge request ae/Sith!151
2018-06-10 16:16:37 +02:00
klmp200 a0a86ef8e1 Allow BDF's members to see subscriptions on users 2018-06-10 16:09:21 +02:00
klmp200 90e1e7c1bb Add promo logo 2018-06-10 16:09:04 +02:00
klmp200 c5be9b5597 Add promo 19's logo 2018-06-10 15:49:53 +02:00
Skia f2106a37a3 counter: fix tests 2018-06-07 19:57:56 +02:00
Skia eae7825260 core/static: fix Matmat results with long names 2018-06-07 00:10:33 +02:00
Skia 61d34b3a09 core, matmat: fix search form 2018-06-06 00:25:27 +02:00
Skia fecb1ae902 core/static: fix Markdown code vertical-align 2018-06-05 00:49:43 +02:00
Skia be1dc62848 core: make a nice user profile 2018-06-05 00:28:43 +02:00
Skia 9146251642 Prevent generation of useless migrations upon settings change 2018-05-08 18:51:29 +02:00
klmp200 01240ce75e Merge branch 'bugfix' into 'master'
Small modification in hope to fix communication screen deformations

See merge request ae/Sith!150
2018-04-29 14:12:22 +02:00
gnikwo 3fe4e64098 Small modification in hope to fix communication screen deformations 2018-04-29 13:53:55 +02:00
Skia 23291ac60e Merge branch 'bugfix' into 'master'
Forum and Com fixes

See merge request ae/Sith!147
2018-04-26 19:50:49 +02:00
klmp200 83f38e617b Forum Form optimisation 2018-04-26 19:38:39 +02:00
klmp200 443616a762 Forum permission fix and form display 2018-04-26 15:20:45 +02:00
klmp200 afa9bd8735 Fix Poster form 2018-04-26 14:48:29 +02:00
Skia 0cc3707059 subscription/tests: remove silly print 2018-04-19 01:10:06 +02:00
Skia bf57329bd8 sas/templates: Improve generation time display 2018-04-18 23:49:12 +02:00
Skia 4d36a961db core/models: improve repair_fs output 2018-04-18 23:02:19 +02:00
Skia 874dfa6cc3 sas/views: change categories ordering 2018-04-18 22:58:03 +02:00
Skia b5aee62558 core/models: don't always repair every single file 2018-04-18 22:54:30 +02:00
Skia 52832eed4d Merge branch 'skia' into 'master'
core/models: make some tools to repair the SithFiles FS regarding the DB

See merge request ae/Sith!144
2018-04-18 22:19:17 +02:00
Skia b2306b62d6 core/models: better handle broken files
Signed-off-by: Skia <skia@libskia.so>
2018-04-16 18:35:00 +02:00
Skia c7b918115d core/models: change thumbnails and compressed SithFile directories
Signed-off-by: Skia <skia@libskia.so>
2018-04-16 18:35:00 +02:00
Skia 0d3c34c155 core/models: refactor SithFile moving and add methods to manage filesystem
Signed-off-by: Skia <skia@libskia.so>
2018-04-16 18:35:00 +02:00
Skia e9e51d34d3 subscription: fix compute_start 2018-04-16 14:54:47 +02:00
Skia d619e0cd9b Merge branch 'weekmail' into 'master'
Weekmail images and colors

See merge request ae/Sith!143
2018-03-26 10:12:14 +02:00
Skia 847b8823af weekmail: reduce image weight 2018-03-26 09:57:50 +02:00
Soldat a84d54accb Change weekmail images and colors 2018-03-26 09:57:40 +02:00
klmp200 41c83b17df Merge branch 'nabos' into 'master'
Changed default display time for posters and permissions on it

See merge request ae/Sith!142
2018-03-18 22:45:11 +01:00
klmp200 cbd333eb47 Changed default display time for posters and permissions on it 2018-03-18 22:28:25 +01:00
Skia d83bb20547 core: small update on footnotes style
Signed-off-by: Skia <skia@libskia.so>
2018-02-22 22:56:15 +01:00
Skia 606f1af4d5 forum: add favorite topics
Signed-off-by: Skia <skia@libskia.so>
2018-02-22 22:28:28 +01:00
Skia f47f846d26 forum: add button CSS class
Signed-off-by: Skia <skia@libskia.so>
2018-02-22 22:15:10 +01:00
klmp200 80bffd00d1 Merge branch 'bugfix' into 'master'
Bugfix for mailing list and posters

See merge request ae/Sith!141
2017-12-22 12:59:51 +01:00
klmp200 43b4579a98 Fix datetime forms for posters 2017-12-22 12:53:43 +01:00
klmp200 c014a6e379 Fix translations 2017-12-22 12:22:37 +01:00
klmp200 b7483513be Fix for mailing lists 2017-12-22 12:06:23 +01:00
Skia 10dfb2c122 Merge branch 'nabos' into 'master'
Communication screens

See merge request ae/Sith!116
2017-12-21 18:25:56 +01:00
Skia a2ee017668 club/views: fix call to parent's get_context_data in PosterListView 2017-12-21 18:16:32 +01:00
gnikwo 22e277d4f7 merged migrations 2017-12-21 16:15:11 +01:00
gnikwo 903f07ecbd Added screen list on poster + Added unmoderated poster artefact + discussions fixes 2017-12-21 12:25:07 +01:00
klmp200 72d2862e3e Posters now working + notifications for com admin 2017-12-16 20:48:36 +01:00
klmp200 5132eb49e4 Merge branch 'elections' into 'master'
It's better to delete an object in delete

See merge request ae/Sith!140
2017-12-12 14:58:02 +01:00
klmp200 5915de9603 It's better to delete an object in delete 2017-12-12 14:52:08 +01:00
krophil 73bd8b0fd3 Merge branch 'revert-3c2f48b7' into 'master'
Revert "Merge branch 'pere200' into 'master'"

See merge request ae/Sith!139
2017-12-12 13:12:10 +01:00
krophil d2c278ba0e Revert "Merge branch 'pere200' into 'master'"
This reverts merge request !138
2017-12-12 13:01:09 +01:00
krophil 3c2f48b750 Merge branch 'pere200' into 'master'
Pere200

See merge request ae/Sith!138
2017-12-11 05:19:30 +01:00
krophil 93f430ac38 PERE 200 2017-12-11 05:11:23 +01:00
klmp200 6335d60ad6 Merge branch 'quickux' into 'master'
Better ui for group selection on election and wiki

See merge request ae/Sith!137
2017-12-10 21:43:54 +01:00
klmp200 d49f7858d3 Better ui for group selection on election and wiki 2017-12-10 21:37:50 +01:00
klmp200 cc99cecaa0 Fix tab mixin on clubs 2017-12-05 15:53:36 +01:00
gnikwo 91d3e9e4dc Delete function + club tabs 2017-12-05 15:24:46 +01:00
klmp200 c8fae39ff0 Merge branch 'elections' into 'master'
Avoid moving role order in election by reloading page

See merge request ae/Sith!136
2017-12-05 14:30:52 +01:00
klmp200 4217b92941 Avoid moving role order in election by reloading page 2017-12-05 14:22:59 +01:00
klmp200 bc7cfc2dba Merge branch 'elections' into 'master'
Election improvements

See merge request ae/Sith!135
2017-12-04 13:36:25 +01:00
klmp200 2f3b481037 Improve deletion and add ordering on roles 2017-12-02 19:05:48 +01:00
klmp200 625b5132c4 Election list deletion and ux improvements 2017-12-01 19:45:28 +01:00
Skia 9ca82af219 Merge branch 'counter' into 'master'
fix can_buy in customer

See merge request ae/Sith!134
2017-12-01 16:03:16 +01:00
krophil 4af3239f4c fix can_buy in customer 2017-12-01 01:44:38 +01:00
gnikwo 88d68ea510 Ready for review 2017-11-28 15:12:25 +01:00
gnikwo 5cd031f579 Ready for review 2017-11-28 15:12:25 +01:00
gnikwo 21b24f2891 Club views and discussions fixes 2017-11-28 15:12:04 +01:00
gnikwo 693c3ed27e Moved club field + migrations 2017-11-28 15:09:21 +01:00
gnikwo 17d3860ec5 Fix bad merge 2017-11-28 15:09:20 +01:00
gnikwo 8d1c648032 Communication screen - without club tool 2017-11-28 15:09:05 +01:00
Skia 23d86464c8 Merge branch 'admin_area' into 'master'
Search field in Subscription admin area

See merge request ae/Sith!133
2017-11-17 12:02:31 +01:00
krophil bb47ad97a3 Search field in Subscription admin area 2017-11-17 11:48:16 +01:00
Skia 64c479a02e Merge branch 'bugfix' into 'master'
Bugfix

See merge request ae/Sith!132
2017-11-16 15:43:54 +01:00
krophil 33964e0bab Better way to check if a user is subscriber 2017-11-16 13:50:34 +01:00
klmp200 42f8ee3518 Merge branch 'teeshirt' into 'master'
Fix translations error for gifts

See merge request ae/Sith!131
2017-11-14 10:23:32 +01:00
klmp200 eb485215d9 Fix translations error for gifts 2017-11-13 18:30:05 +01:00
Skia 6ee1ee365b Merge branch 'bugfix' into 'master'
Fix AGAIN subscription display

See merge request ae/Sith!130
2017-11-09 15:22:06 +01:00
krophil 0ba69da3b6 Fix AGAIN subscription display 2017-11-09 14:49:07 +01:00
Skia 3793321c37 Update README and Markdown test assets
Signed-off-by: Skia <skia@libskia.so>
2017-11-09 14:37:29 +01:00
Skia 4bf805e2f5 Merge branch 'krophil' into 'master'
Add comment in product type

See merge request ae/Sith!126
2017-11-07 12:10:49 +01:00
krophil 846be54431 Merge branch 'teeshirt' into 'master'
Add gift function

See merge request ae/Sith!129
2017-11-06 00:55:28 +01:00
klmp200 c6847ebc47 Translations for gifts 2017-11-06 00:44:18 +01:00
klmp200 e3fd3b81ab Add gift function 2017-11-06 00:30:37 +01:00
klmp200 9ab7cb98dc Merge branch 'bugfix' into 'master'
Fix external ressources

See merge request ae/Sith!128
2017-11-05 23:31:29 +01:00
krophil f1a9344524 Fix external ressources 2017-11-05 13:27:58 +01:00
Skia 6ebdd53d98 club: make clubs viewable by old subscribers
Signed-off-by: Skia <skia@libskia.so>
2017-11-01 14:51:55 +01:00
krophil 6113de33ec Add comment in product type 2017-10-25 23:02:46 +02:00
Skia 4810934a10 Merge branch 'bugfix' into 'master'
Fix date displaying in user_detail

See merge request ae/Sith!127
2017-10-25 20:23:43 +02:00
Skia bc24baef09 Merge branch 'Tresorerie' into 'master'
Add possibility to not link an operation

See merge request ae/Sith!125
2017-10-25 20:20:08 +02:00
krophil 2bb510932b Fix date displaying in user_detail 2017-10-24 13:08:18 +02:00
krophil 5fb57e97f7 Add possibility to not link an operation 2017-10-22 22:29:36 +02:00
Skia cd4b0d8e0c Merge branch 'external_option' into 'master'
Integrate external_res variable

See merge request ae/Sith!120
2017-10-18 15:32:06 +02:00
krophil 6c957e3ce4 Integrate external_res variable 2017-10-18 14:44:47 +02:00
Skia 578fa1495d sas: fix notification callback
Signed-off-by: Skia <skia@libskia.so>
2017-10-15 12:00:33 +02:00
Skia d5c6695f80 core: improve notification callback system
Signed-off-by: Skia <skia@libskia.so>
2017-10-15 12:00:33 +02:00
Skia 9b0b381fa3 core: make populate command more predictable (should fix the random failing test)
Signed-off-by: Skia <skia@libskia.so>
2017-10-14 13:51:50 +02:00
Skia 69c7036089 Merge branch 'krophil' into 'master'
Add search form in admin

See merge request ae/Sith!124
2017-10-12 09:29:02 +02:00
Skia 56a1e09a28 Fix requirements.txt: keep django-rest-framework <3.7
Signed-off-by: Skia <skia@libskia.so>
2017-10-11 12:45:57 +02:00
Skia 3c50aa554a Add pygraphviz to requirements
Signed-off-by: Skia <skia@libskia.so>
2017-10-11 12:31:17 +02:00
Skia 7879b6dd6b core: add family graphs
Signed-off-by: Skia <skia@libskia.so>
2017-10-11 12:30:33 +02:00
krophil 3994a58a2f Add search form in admin 2017-10-11 00:01:24 +02:00
Skia 47bace2057 Merge branch 'Tresorerie' into 'master'
Enhanced display in journals

See merge request ae/Sith!123
2017-10-09 17:21:37 +02:00
Skia 7c2e562c1e locale: fix translation
Signed-off-by: Skia <skia@libskia.so>
2017-10-09 17:15:46 +02:00
krophil 3104270675 Few changes in accounting design 2017-10-09 16:24:34 +02:00
Skia 43f51813e0 sas: fix album preview
Signed-off-by: Skia <skia@libskia.so>
2017-10-06 17:57:54 +02:00
klmp200 8492903a39 Merge branch 'clubs' into 'master'
Found a way to avoid strange error for club page

See merge request ae/Sith!122
2017-10-06 17:50:59 +02:00
klmp200 4369d9f593 Found a way to avoid strange error for club page 2017-10-06 17:44:41 +02:00
Skia 87abdf7e68 trombi: update export page again
Signed-off-by: Skia <skia@libskia.so>
2017-10-06 17:29:23 +02:00
Skia a09c634ac6 core: add phonenumber template filter
Signed-off-by: Skia <skia@libskia.so>
2017-10-06 17:28:51 +02:00
Skia 8a58055d06 trombi: update export page
Signed-off-by: Skia <skia@libskia.so>
2017-10-06 16:38:36 +02:00
Skia fae2a572b1 Merge branch 'fontawesome' into 'master'
Few changes in design

See merge request ae/Sith!119
2017-10-06 15:30:30 +02:00
Skia e0517c5f4f Merge branch 'facebook-button' into 'master'
Small fix for logo in news

See merge request ae/Sith!121
2017-10-06 15:09:50 +02:00
krophil be958bca7e Small fix for logo in news 2017-10-06 12:00:12 +02:00
krophil c8c60b8b7d Few changes in design 2017-10-06 11:58:51 +02:00
Skia 0bef8d33d3 Merge branch 'clubs' into 'master'
Club tools enhacement

See merge request ae/Sith!108
2017-10-06 11:48:02 +02:00
klmp200 cec3ec8164 Club tools translations 2017-10-06 11:24:48 +02:00
klmp200 30f7835cef Operations documentation 2017-10-06 11:09:31 +02:00
klmp200 8146186447 Fix some bugs in mailings with new club tools 2017-10-06 11:09:31 +02:00
klmp200 4800db3c2c Add auto generation for mailing lists 2017-10-06 11:09:31 +02:00
klmp200 4310441269 Redirect directly on member page when adding a new member. Still has a bug : an user already member always show when success 2017-10-06 11:09:31 +02:00
klmp200 baa7be69e4 Better integration of wiki pages on clubs 2017-10-06 11:09:31 +02:00
klmp200 2c1cf2d7af Fix for club tools 2017-10-06 11:09:31 +02:00
klmp200 4026d076b3 Forgoten migration from skia and fixed migration 2017-10-06 11:09:30 +02:00
klmp200 db509bf060 Nice club presentation 2017-10-06 11:09:30 +02:00
klmp200 790d723d08 Fix page creation method for clubs 2017-10-06 11:09:30 +02:00
klmp200 f4bc1b140c Fix is_active migration 2017-10-06 11:09:30 +02:00
klmp200 12c49b285a Fix page permissions and fix migration when on sqlite backend 2017-10-06 11:09:30 +02:00
klmp200 aa49b2d4ce Fix regex for pages 2017-10-06 11:09:30 +02:00
klmp200 e2078a8c15 Sync club pages with club tree 2017-10-06 11:09:30 +02:00
klmp200 939146bddd Sync pages with club unix_name 2017-10-06 11:09:29 +02:00
klmp200 fe69cbcee1 Add page for clubs and inactive clubs 2017-10-06 11:09:29 +02:00
Skia 13620de754 Merge branch 'facebook-button' into 'master'
Enhanced news

See merge request ae/Sith!117
2017-10-05 19:29:36 +02:00
krophil 3089b484d3 Enhanced news 2017-10-02 14:29:36 +02:00
klmp200 aab589b5d1 Merge branch 'fontawesome' into 'master'
add font-awesome

See merge request ae/Sith!118
2017-09-29 14:55:25 +02:00
krophil acbeb3d3c8 add font-awesome 2017-09-29 14:35:06 +02:00
Skia 13a2cc22dd core: fix some CSS
Signed-off-by: Skia <skia@libskia.so>
2017-09-26 14:05:19 +02:00
Skia b87990e3db com: add birthdays block
Signed-off-by: Skia <skia@libskia.so>
2017-09-26 13:45:40 +02:00
Skia 7b48156259 locale: update translation
Signed-off-by: Skia <skia@libskia.so>
2017-09-26 12:13:36 +02:00
Skia cda89d66cd com: improve news page
Signed-off-by: Skia <skia@libskia.so>
2017-09-26 12:13:23 +02:00
Skia a2dc00f4e5 club: add club logo
Signed-off-by: Skia <skia@libskia.so>
2017-09-25 20:13:35 +02:00
Skia 49b77480e6 sas: clean up old notif trigger
Signed-off-by: Skia <skia@libskia.so>
2017-09-25 12:50:02 +02:00
Skia 144a56570b locale: update translations
Signed-off-by: Skia <skia@libskia.so>
2017-09-25 12:40:39 +02:00
Skia f0c34fe70c sas: add permanent notification for SAS moderation
Signed-off-by: Skia <skia@libskia.so>
2017-09-25 12:35:56 +02:00
Skia 469304585c sas: update models managers
Signed-off-by: Skia <skia@libskia.so>
2017-09-25 12:34:05 +02:00
Skia 3a16c7aab4 trombi: change comments format in export
Signed-off-by: Skia <skia@libskia.so>
2017-09-25 11:08:20 +02:00
Skia c7f5203122 trombi: add dpt/option to export
Signed-off-by: Skia <skia@libskia.so>
2017-09-24 19:39:20 +02:00
Skia d2fccdb09b Merge branch 'bugfix' into 'master'
Small fix on news deletion

See merge request !115
2017-09-18 19:46:54 +02:00
krophil 56b5fa733b Small fixes on news 2017-09-18 16:28:11 +02:00
Skia 3e769195e3 Merge branch 'facebook-button' into 'master'
Add facebook button

See merge request !112
2017-09-17 15:18:07 +02:00
krophil a89109b4e8 Add translations and small fix 2017-09-17 15:04:30 +02:00
klmp200 9318292ed8 Merge branch 'sli' into 'master'
Logo for 18

See merge request !114
2017-09-13 18:34:22 +02:00
klmp200 b1c3ea9e2c Logo for 18 2017-09-13 18:28:18 +02:00
krophil d888a6b68a Add Twitter button 2017-09-12 19:20:12 +02:00
krophil a40c48a792 Add facebook button 2017-09-12 19:04:37 +02:00
Skia d797003028 coverage: blacklist some files
Signed-off-by: Skia <skia@libskia.so>
2017-09-07 11:50:05 +02:00
Skia 04fdb251e2 subscription: fix tests
Signed-off-by: Skia <skia@libskia.so>
2017-09-07 11:21:32 +02:00
Skia 96d0ae36be subscription: rename test
Signed-off-by: Skia <skia@libskia.so>
2017-09-07 01:27:49 +02:00
krophil 2f912a197c Allow to subscribe before subscription end 2017-09-06 19:55:14 +02:00
Skia 53696b7750 locale: make news notif translation
Signed-off-by: Skia <skia@libskia.so>
2017-09-06 13:19:47 +02:00
Skia 0184b9c29b core, com: make permanent notifications for news to moderate
This needs to be made for other stuff, like the SAS or the files...

Signed-off-by: Skia <skia@libskia.so>
2017-09-06 13:17:23 +02:00
Skia dd5926b404 core: fix notif ordering
Signed-off-by: Skia <skia@libskia.so>
2017-09-06 13:05:51 +02:00
Skia 4c1b231ec9 com: add NewsDeleteView
Signed-off-by: Skia <skia@libskia.so>
2017-09-06 12:47:21 +02:00
Skia 6456d18fc4 core, com: tool bar and agenda design updates
Signed-off-by: Skia <skia@libskia.so>
2017-09-03 19:05:45 +02:00
Skia e0067c3956 Merge branch 'krophil' into 'master'
Link to old site updated

See merge request !107
2017-09-03 18:13:22 +02:00
Skia 6bad524ede com: fix news edit display
Signed-off-by: Skia <skia@libskia.so>
2017-09-03 18:12:52 +02:00
Skia 896007aedd com: fix news display
Signed-off-by: Skia <skia@libskia.so>
2017-09-03 18:10:59 +02:00
krophil 97cdf0e9d8 Link to old site updated 2017-09-03 18:04:05 +02:00
Skia 2847a4547e forum: display only viewable topics in "last unread"
Signed-off-by: Skia <skia@libskia.so>
2017-09-03 12:23:26 +02:00
Skia caa0c2099b core: fix notifications colors
Signed-off-by: Skia <skia@libskia.so>
2017-09-03 12:01:52 +02:00
Skia 283e128e93 core: jQuery UI widget theme overrides
Signed-off-by: Skia <skia@libskia.so>
2017-09-02 22:33:13 +02:00
Skia f5abfc3c12 core: still some design improvements
Signed-off-by: Skia <skia@libskia.so>
2017-09-02 20:59:45 +02:00
klmp200 6d09a9e9b0 Merge branch 'krophil' into 'master'
Oups, I did it again...

See merge request !106
2017-09-02 15:39:01 +02:00
krophil 9489b52304 Oups, I did it again... 2017-09-02 15:31:20 +02:00
klmp200 e581de0a94 Merge branch 'krophil' into 'master'
Add color palette creator + add list of refillings

See merge request !105
2017-09-02 15:28:19 +02:00
krophil e71db5a997 Add translations 2017-09-02 15:22:50 +02:00
krophil 39ce14804a Add refillings list 2017-09-02 15:16:29 +02:00
krophil 63ae89b30a Add color palette creator 2017-09-02 13:41:29 +02:00
Skia 9f259b35bd core, counter: add preferences for counter notifications
Signed-off-by: Skia <skia@libskia.so>
2017-09-02 12:42:07 +02:00
Skia 914feffbd8 locale: update translations
Signed-off-by: Skia <skia@libskia.so>
2017-09-02 02:19:48 +02:00
Skia 8b9c3fb5c6 core: improve notification box
Signed-off-by: Skia <skia@libskia.so>
2017-09-02 02:19:34 +02:00
Skia 4ca3aebc77 core: improve alert and info boxes
Signed-off-by: Skia <skia@libskia.so>
2017-09-02 02:06:22 +02:00
Skia 5c709a5416 core: great rework of the header bar
Signed-off-by: Skia <skia@libskia.so>
2017-09-01 18:31:48 +02:00
Skia 22151ef3b3 core: display news page in place of index for logged in users
Signed-off-by: Skia <skia@libskia.so>
2017-09-01 12:33:23 +02:00
Skia 4edb9a78c6 com: add agenda on news page
Signed-off-by: Skia <skia@libskia.so>
2017-09-01 12:22:38 +02:00
Skia 0532f7337a Merge branch 'jewels_subscription' into 'master'
Jewels subscription

See merge request !98
2017-08-31 17:45:54 +02:00
krophil 3be64d6a8f New subscription type for jewels
New condition to consider floats in subscriptions
2017-08-31 16:37:03 +02:00
krophil 94582a2d96 Free subscription for jewels 2017-08-31 16:18:28 +02:00
Skia 02b317eee8 locale: fix translations
Signed-off-by: Skia <skia@libskia.so>
2017-08-31 15:37:05 +02:00
klmp200 bb40d48b62 Merge branch 'nintendo_switch' into 'master'
New Sponsors page

See merge request !104
2017-08-31 14:19:05 +02:00
krophil 2bd1927e39 New Sponsors page 2017-08-31 14:11:18 +02:00
Skia 7ec9d7f8c6 gitignore: ignore coverage artifacts
Signed-off-by: Skia <skia@libskia.so>
2017-08-29 16:45:18 +02:00
Skia 0232953260 CI: add coverage report
Signed-off-by: Skia <skia@libskia.so>
2017-08-29 16:01:01 +02:00
Skia 9ee5c387c5 subscription: add tests
Signed-off-by: Skia <skia@libskia.so>
2017-08-29 15:07:03 +02:00
klmp200 5e8ae83cf2 Merge branch 'mailing' into 'master'
mailing: Oups, forgot some \n in mailing format that I couldn't see at the first time

See merge request !103
2017-08-25 16:23:01 +02:00
klmp200 1f8b035558 mailing: Oups, forgot some \n in mailing format that I couldn't see at the first time 2017-08-25 16:14:02 +02:00
Skia 5504142efa core, templates: fix logo link
Signed-off-by: Skia <skia@libskia.so>
2017-08-25 14:28:17 +02:00
Skia 0d5595c683 core: add test for Markdown syntax
Signed-off-by: Skia <skia@libskia.so>
2017-08-24 16:30:46 +02:00
Skia 30f650ecce core: use more AJAX forms in admin UI
Signed-off-by: Skia <skia@libskia.so>
2017-08-24 15:35:17 +02:00
klmp200 c0b3024cc2 Merge branch 'mailing' into 'master'
Fix permission for club in user profile

See merge request !102
2017-08-24 14:49:04 +02:00
klmp200 b0ce8b1b83 Fix permission for club in user profile 2017-08-24 14:42:57 +02:00
Skia b5e7a0d747 Merge branch 'mailing' into 'master'
Fix error when deleting user from mailing when only email provided

See merge request !101
2017-08-24 00:26:38 +02:00
Skia 6c66ae6b39 Merge branch 'disable_CB' into 'master'
Allow disabling CB in crisis time

See merge request !100
2017-08-24 00:22:29 +02:00
klmp200 f65f261cfd mailing: Fix error when deleting user from mailing when only email provided 2017-08-24 00:20:20 +02:00
klmp200 6f6ad123af Allow disabling CB in crisis time 2017-08-24 00:14:36 +02:00
klmp200 8e166b75e4 Merge branch 'nintendo_switch' into 'master'
Changing urls

See merge request !99
2017-08-22 23:53:56 +02:00
krophil b74600b3f3 Changing urls 2017-08-22 23:47:55 +02:00
Skia 4ad923ff06 Merge branch 'mailing' into 'master'
Mailing list system

See merge request !96
2017-08-22 23:02:46 +02:00
klmp200 4f6109e27c Refactor mailings email 2017-08-22 22:39:12 +02:00
klmp200 c83a990165 Wtf migration blocking me 2017-08-22 16:03:24 +02:00
klmp200 62b59f92fd Translations 2017-08-22 15:51:09 +02:00
klmp200 d179a0a6d0 Fix typo and merge migrations 2017-08-22 15:36:39 +02:00
klmp200 470680e760 Add moderation for mailing lists 2017-08-22 15:36:39 +02:00
klmp200 fe187dae38 Only begining of the mail is now needed 2017-08-22 15:36:39 +02:00
klmp200 ce9e17ea24 Some mailing list fixs 2017-08-22 15:36:39 +02:00
klmp200 9e5159152a Little right fix 2017-08-22 15:36:39 +02:00
klmp200 cc8991a938 Fix migration for mailing 2017-08-22 15:36:39 +02:00
klmp200 51992e1c30 Mailing migration 2017-08-22 15:36:39 +02:00
klmp200 72d968e9a5 Mailing migrations 2017-08-22 15:36:39 +02:00
klmp200 76efb91e40 Move mailing list admin to com 2017-08-22 15:36:39 +02:00
klmp200 69e997d587 Refactoring mailings 2017-08-22 15:36:39 +02:00
klmp200 3a6f7009fd Fix display rights in user profile for mailing 2017-08-22 15:36:39 +02:00
klmp200 e82e338e76 Fix mailing settings position 2017-08-22 15:36:39 +02:00
klmp200 8c9f02a142 Add fetch function for DSI 2017-08-22 15:36:39 +02:00
klmp200 9cb88a878d Even better mailing 2017-08-22 15:36:39 +02:00
klmp200 feaf6b73b7 Begin mailing list system 2017-08-22 15:36:39 +02:00
klmp200 df42617cda Merge branch 'krophil' into 'master'
Add a new subscription for the Welcome Week

See merge request !97
2017-08-21 21:34:20 +02:00
krophil e785ad985f Add a new subscription for the Welcome Week 2017-08-21 21:06:05 +02:00
Skia d511bdef03 Merge branch 'consignes' into 'master'
Wtf forgot this little guy

See merge request !95
2017-08-17 11:51:43 +02:00
klmp200 6cfdcb093f Wtf forgot this little guy 2017-08-17 00:10:12 +02:00
Skia 83b00450eb com: improve news admin view
Signed-off-by: Skia <skia@libskia.so>
2017-08-16 15:37:35 +02:00
klmp200 d864c00472 Merge branch 'matmatronch' into 'master'
Translations fix for matmatronch

See merge request !94
2017-08-15 19:11:12 +02:00
klmp200 f49f889d5b Translations fix 2017-08-15 18:57:50 +02:00
Skia b5599db9bf Merge branch 'matmatronch' into 'master'
Nouveau matmatronch

See merge request !92
2017-08-15 18:13:11 +02:00
klmp200 0f408d9d89 Translations 2017-08-15 18:08:32 +02:00
klmp200 a9e23920ee Matmat renames 2017-08-15 18:05:07 +02:00
klmp200 dc571836ae Fixed issues with department and sex form 2017-08-15 18:05:07 +02:00
klmp200 86d62f12e7 Fully functionnal Matmatronch 2017-08-15 18:05:07 +02:00
klmp200 349475cd37 Functionnal search engine 2017-08-15 18:05:07 +02:00
klmp200 39616874a8 Fix broken pagination by remembering last search 2017-08-15 18:05:07 +02:00
klmp200 9ff8f02a45 Form remember last entered values 2017-08-15 18:05:07 +02:00
klmp200 b7c382a1a8 Basic search structure 2017-08-15 18:05:07 +02:00
Skia 0ffd7485e3 Merge branch 'consignes' into 'master'
Add limit for ecocup recording

See merge request !90
2017-08-15 18:03:51 +02:00
klmp200 3e950e1dd1 Migration fix 2017-08-15 17:37:25 +02:00
klmp200 de4521c192 Ecocup limit comments 2017-08-15 14:03:56 +02:00
klmp200 748e3ae326 Refactor and migration corrections 2017-08-15 13:57:49 +02:00
klmp200 240b68f98d Allow negative amount for customer 2017-08-15 13:57:49 +02:00
klmp200 d60e14a303 Migration from old database 2017-08-15 13:57:49 +02:00
klmp200 7588cc8f73 Hardcoding ecocup values 2017-08-15 13:57:49 +02:00
klmp200 40927fa13d Add limit for ecocup recording 2017-08-15 13:57:49 +02:00
Skia 2058d58db6 Merge branch 'bottomLinks' into 'master'
Bottom links migrations to internal wiki

See merge request !93
2017-08-15 12:00:19 +02:00
klmp200 22407e2f85 Bottom links migrations to internal wiki 2017-08-15 03:30:39 +02:00
Skia 6f79c6c590 core: fix paragraph annoying scroll bar
Signed-off-by: Skia <skia@libskia.so>
2017-08-09 22:02:41 +02:00
Skia d3796479ee core: put the AE logo in the CSS
Signed-off-by: Skia <skia@libskia.so>
2017-08-09 16:40:03 +02:00
Skia 61d2765510 core: refactor user picture page algorithm
Signed-off-by: Skia <skia@libskia.so>
2017-08-02 20:12:41 +02:00
Skia 3eea8ed4e3 trombi: make the export page
Signed-off-by: Skia <skia@libskia.so>
2017-08-01 13:54:35 +02:00
Skia 8bf72daa31 trombi: prevent double comment using "Precedent" browser button
Signed-off-by: Skia <skia@libskia.so>
2017-07-30 11:52:10 +02:00
Skia e4e4eae11b Merge branch 'subscriptions' into 'master'
Some selected club members can now make people subscribe and fix major security …

Le bdf m'as demandé si c'était possible pour eux de faire des cotisations pour les nouveaux
Je retire WIP quand j'ai la confirmation du bureau que je peux faire ça
Par contre il j'y ai patché une grosse faille de sécurité : se mettre curieux à l'AE suffit à avoir tous les droits de board_member

See merge request !91
2017-07-26 20:48:01 +02:00
klmp200 c56094eaaf Some selected club members can now make people subscribe and fix major security hole in board_member verification 2017-07-26 20:31:29 +02:00
Skia b99bbc385a css: fix overflow problem
Signed-off-by: Skia <skia@libskia.so>
2017-07-26 18:41:21 +02:00
Skia e085556def sas: allow ancient subscriber to add people on pictures
Signed-off-by: Skia <skia@libskia.so>
2017-07-26 16:55:00 +02:00
Skia 8501df0bef trombi: improve templates
Signed-off-by: Skia <skia@libskia.so>
2017-07-26 16:53:40 +02:00
Skia e80f5b6f0f Merge branch 'krophil' into 'master'
Add a nice favicon

See merge request !88
2017-07-06 14:14:09 +02:00
krophil 2ae4e36eea Add a nice favicon 2017-07-06 14:04:24 +02:00
Skia 8a95f71596 trombi: add missing quick notif
Signed-off-by: Skia <skia@libskia.so>
2017-07-05 21:54:32 +02:00
Skia de96c07ba8 trombi: allow admins to manually add users
Signed-off-by: Skia <skia@libskia.so>
2017-07-05 21:41:33 +02:00
Skia a108291422 trombi: update people ordering
Signed-off-by: Skia <skia@libskia.so>
2017-07-05 21:41:33 +02:00
Skia 282d9cd180 trombi: add TrombiUser to admin
Signed-off-by: Skia <skia@libskia.so>
2017-07-05 21:41:33 +02:00
Skia 15a9eff599 forum: fix time localization
Signed-off-by: Skia <skia@libskia.so>
2017-07-05 21:41:33 +02:00
Skia 3c22db5bd2 Merge branch 'bugfix' into 'master'
Small fix on accounting permissions

See merge request !87
2017-06-26 11:23:07 +02:00
krophil f8e0147bf5 Small fix on accounting permissions 2017-06-26 11:17:30 +02:00
Skia 71f9e359c0 Merge branch 'forum' into 'master'
Remove ambiguity for topic creation in a category

See merge request !85
2017-06-14 08:35:17 +02:00
krophil 7515e826f8 Remove ambiguity 2017-06-14 00:47:16 +02:00
Skia 58dc179163 Merge branch 'bugfix' into 'master'
Fix import in trombi views

See merge request !84
2017-06-13 11:57:04 +02:00
krophil e08a8c4927 Fix import in trombi views 2017-06-13 11:45:17 +02:00
Skia fbcf525378 Merge branch 'pep8' into 'master'
Pep8

See merge request !81
2017-06-13 11:39:38 +02:00
Skia 753fe0d176 Merge branch 'bugfix' into 'master'
Fix trombi creation

See merge request !83
2017-06-13 11:39:17 +02:00
krophil 890943ea48 Fix trombi creation 2017-06-13 10:55:12 +02:00
krophil 9447de4468 fix merging 2017-06-13 10:49:11 +02:00
krophil 69c95cfd37 Format trombi 2017-06-13 10:22:41 +02:00
krophil 113c9e696b Format subscription 2017-06-13 10:07:57 +02:00
krophil cd46e099b6 Format sith 2017-06-13 10:04:13 +02:00
krophil e2311dcb71 Format sas 2017-06-13 10:04:13 +02:00
krophil 13ec91e7e5 Format launderette 2017-06-13 10:04:13 +02:00
krophil 6a43c2cef6 Format forum 2017-06-13 10:04:13 +02:00
krophil b3466237ca Format settings 2017-06-13 10:04:13 +02:00
krophil 4395d62cd8 Format eboutic 2017-06-13 10:04:13 +02:00
krophil d722efc40f Format counter 2017-06-13 10:04:13 +02:00
krophil e7de8b2aec Format core 2017-06-13 10:04:13 +02:00
krophil 4f4ea5dde9 Format com 2017-06-13 09:48:24 +02:00
krophil 73b2c9d4c5 Format club 2017-06-13 09:48:24 +02:00
krophil 544ff630a5 Format accounting 2017-06-13 09:48:24 +02:00
Skia 38026025af trombi: add safeguard on user deletion
Signed-off-by: Skia <skia@libskia.so>
2017-06-13 00:35:49 +02:00
Skia f85ce96225 trombi: Many UI/UX improvements
Signed-off-by: Skia <skia@libskia.so>
2017-06-13 00:23:56 +02:00
Skia f26f2f4229 trombi: add custom club memberships
Signed-off-by: Skia <skia@libskia.so>
2017-06-12 23:52:59 +02:00
Skia 5df9be9188 Move computing of start of semester to core/utils
Signed-off-by: Skia <skia@libskia.so>
2017-06-12 22:53:25 +02:00
Skia a96efafc8e Merge branch 'counter' into 'master'
Fix operation form

See merge request !82
2017-06-12 22:38:21 +02:00
Skia 8ca455a398 Epic fix
Signed-off-by: Skia <skia@libskia.so>
2017-06-12 22:35:22 +02:00
krophil 43b1d1f3b5 Fix operation form 2017-06-12 19:29:47 +02:00
Skia 37a5db537b Re-fix AnonymousUser
Signed-off-by: Skia <skia@libskia.so>
2017-06-12 14:01:28 +02:00
Skia b06f270ea5 Revert "Fix AnonymousUser"
This reverts commit e7f7c57558.
2017-06-12 13:57:08 +02:00
Skia ecf5465716 Merge branch 'Tresorerie' 2017-06-12 08:13:05 +02:00
Skia 88d81df23d Fix Trombi edit comment view
Signed-off-by: Skia <skia@libskia.so>
2017-06-11 23:16:35 +02:00
Skia b4be40a3a7 Change the Markdown super and sub texts not to break the Ragots
Signed-off-by: Skia <skia@libskia.so>
2017-06-10 21:39:56 +02:00
Skia 58beb551e8 Fix unread messages in topic
Signed-off-by: Skia <skia@libskia.so>
2017-06-10 21:05:36 +02:00
Skia ca047d9655 Damn, I broke the tests!
Signed-off-by: Skia <skia@libskia.so>
2017-06-10 20:28:01 +02:00
Skia a89fb23d33 That's just a ridiculous little fix
Signed-off-by: Skia <skia@libskia.so>
2017-06-10 20:03:37 +02:00
Skia ce46a9d9da Some small clean up and refactoring
Signed-off-by: Skia <skia@libskia.so>
2017-06-10 19:56:47 +02:00
Skia 2925cde8ab Add a MarkdownInput widget, and make use of it
Signed-off-by: Skia <skia@libskia.so>
2017-06-10 19:40:47 +02:00
Skia 4b9fa0cd57 Fix some Markdown and add basic textarea helper
Signed-off-by: Skia <skia@libskia.so>
2017-06-10 19:14:58 +02:00
Skia 457fc36e16 Fix markdown rendering on some pages, and add a link to the syntax help
Signed-off-by: Skia <skia@libskia.so>
2017-06-10 16:54:19 +02:00
krophil 8ba21b94dc add translations 2017-06-09 16:39:38 +02:00
krophil 0e171fbc8f add some validationErrors on OperationForm 2017-06-09 16:06:18 +02:00
Skia 1bcde80a28 Fix cache clearing
Signed-off-by: Skia <skia@libskia.so>
2017-06-07 22:51:17 +02:00
Skia 23293ea88e Small style update to improve Markdown rendering
Signed-off-by: Skia <skia@libskia.so>
2017-06-07 22:49:59 +02:00
Skia 10ee5e1708 Merge branch 'counter' into 'master'
Tests for counter

See merge request !77
2017-06-07 19:45:05 +02:00
Skia 99ed1c0c79 Merge branch 'elections' into 'master'
Amélioration des élections

See merge request !79
2017-06-07 19:41:35 +02:00
klmp200 ea09604b2e Other line fix 2017-06-07 19:36:55 +02:00
krophil eb510e102c Test for click 2017-06-07 19:28:15 +02:00
klmp200 b6a68fa090 Fix some ugly lines 2017-06-07 19:16:55 +02:00
klmp200 41a9bf9953 Elections : Fix tests, cleaned urls and add nice description 2017-06-07 18:49:24 +02:00
klmp200 c4389bb9cd Add a way for admin to delete elections and add archive system 2017-06-07 18:42:16 +02:00
klmp200 0076c9cdb4 Macro for pagination 2017-06-07 18:39:42 +02:00
klmp200 d3fbc65cdc Pep8 for elections 2017-06-07 18:39:42 +02:00
krophil 0af72500c6 Add some tests on counter 2017-06-07 18:36:26 +02:00
Skia 63acf588ca Add basic unfinished counter test 2017-06-07 18:36:26 +02:00
Skia 969d5699fa Merge branch 'subscriptions' into 'master'
Subscriptions stats

Des « statistiques » de cotisations
C'est pratique

See merge request !78
2017-06-07 18:05:55 +02:00
klmp200 801d287c0c Random colors for stats graphs 2017-06-07 15:23:32 +02:00
klmp200 22945483d6 Add some graphics for subscriptions stats 2017-06-07 14:12:03 +02:00
klmp200 88762c492f Subscriptions stats optimisations + form for start and end date 2017-06-06 23:27:57 +02:00
klmp200 1c05671784 Added forgotten column and a link in tools 2017-06-06 22:03:56 +02:00
klmp200 e97135bf47 Add subscriptions stats 2017-06-06 22:03:56 +02:00
Skia e7f7c57558 Fix AnonymousUser
Signed-off-by: Skia <skia@libskia.so>
2017-06-06 19:37:45 +02:00
Skia cef2230640 Merge branch 'bugfix' into 'master'
fix topic creation

See merge request !76
2017-06-02 10:57:24 +02:00
krophil 1ebfcdedec fix topic creation 2017-06-02 10:55:50 +02:00
Skia 3521ad699e forum: fix reply page
Signed-off-by: Skia <skia@libskia.so>
2017-06-02 08:47:47 +02:00
Skia 38622c98e9 Merge branch 'wip' into 'master'
Forum improvements

See merge request !75
2017-06-01 13:31:35 +02:00
Skia f3c1ab4ae4 forum: use short names
Signed-off-by: Skia <skia@libskia.so>
2017-05-31 23:56:47 +02:00
Skia 11d20f43e5 Add some missing translations
Signed-off-by: Skia <skia@libskia.so>
2017-05-31 23:43:22 +02:00
Skia 978b891137 Add a cache clearing mechanism to fix rights update problems
Signed-off-by: Skia <skia@libskia.so>
2017-05-31 21:49:54 +02:00
Skia 22330e6d9f forum: add on_delete=models.SET_NULL on _last_message fields
Signed-off-by: Skia <skia@libskia.so>
2017-05-31 19:50:41 +02:00
Skia e5ce9658ee Fix images and links parsing in doku_to_markdown
Signed-off-by: Skia <skia@libskia.so>
2017-05-31 19:13:43 +02:00
Skia 463e0b7055 Again some small forum improvements
Signed-off-by: Skia <skia@libskia.so>
2017-05-31 00:41:39 +02:00
Skia 136d0f3fa0 Add basic BBcode translator
Signed-off-by: Skia <skia@libskia.so>
2017-05-30 23:40:01 +02:00
Skia 32ac6640ab Small fix with forum topic titles
Signed-off-by: Skia <skia@libskia.so>
2017-05-30 23:37:06 +02:00
Skia 06b67f1d27 Still reducing the number of queries on the Forum
Signed-off-by: Skia <skia@libskia.so>
2017-05-30 23:37:06 +02:00
Skia ba65dc5d46 Fix doku_to_markdown
Signed-off-by: Skia <skia@libskia.so>
2017-05-30 19:33:09 +02:00
Skia 1f0a34fb6c Finish the Forum migrate script 2017-05-30 19:33:09 +02:00
Skia 97a39b0652 Make **a lot** of Forum improvements in reducing the number of queries per page 2017-05-30 19:33:09 +02:00
Skia d7135e4d27 Make a lot of pimp in the Forum 2017-05-30 19:33:09 +02:00
Skia ec307cd5df Add db index in counter 2017-05-30 19:33:09 +02:00
Skia cf062a35d3 Add query reductions in core 2017-05-30 19:33:09 +02:00
Skia e689f7f1db Add index and query reduction in clubs 2017-05-30 19:33:09 +02:00
Skia 2f5bd7d2ef Fix Weekmail article creation view's rights 2017-05-17 10:56:38 +02:00
Skia 23fe797a9e Make less DB queries (particularly in the Forum) 2017-05-14 04:38:33 +02:00
Skia 862a4619b3 Add doku_to_markdown function 2017-05-14 03:17:42 +02:00
Skia 8c151fa498 Add support for image sizing in Markdown 2017-05-14 01:03:50 +02:00
Skia 0a84ef8438 Allow to unmoderate news 2017-05-13 18:32:13 +02:00
Skia 231cb236dc Add moderation tool to Trombi 2017-05-12 18:42:52 +02:00
Skia adeda41b52 Add profiles to Trombi 2017-05-12 10:25:26 +02:00
Skia d88ffae51b Change Trombi permissions 2017-05-12 09:07:35 +02:00
Skia a0bd5ee8ff Some more trombi pimping 2017-05-11 18:34:05 +02:00
Skia a485ff1b8e Remove useless timezone import 2017-05-11 16:18:30 +02:00
krophil d79416f80a fix date format in Trombi model 2017-05-11 13:25:51 +02:00
Skia 47a96829d0 Reset trombi's migrations 2017-05-10 23:33:24 +02:00
Skia d913b8b64f Some more pimp in Trombi + translations 2017-05-10 23:30:20 +02:00
Skia 35f983131f Improve Trombi again with pictures, notifs, and style! 2017-05-10 23:05:05 +02:00
Skia f2b2ff533d Rename Matmat to Trombi 2017-05-10 22:17:05 +02:00
Skia dec1a2cdd7 Add profile form in matmat 2017-05-10 21:59:22 +02:00
Skia e00c948da9 Improve Matmat, still needs a profile form 2017-05-10 19:19:33 +02:00
Skia b3bc33a319 Add first Matmat' app 2017-05-10 19:19:33 +02:00
Skia 5060114305 Add missing forum migration (and tiny translation fix) 2017-05-10 19:18:33 +02:00
Skia 319bb0c2d1 Fix important rights problem in clubs 2017-05-10 19:16:18 +02:00
Skia bf38de2db8 Merge branch 'tempcss' into 'master'
Few modifications in accordance with com

See merge request !74
2017-05-10 16:19:33 +02:00
krophil 05d1f43b55 Few modifications in accordance with com 2017-05-10 15:32:50 +02:00
Skia a0f47cac80 Merge branch 'tempcss' into 'master'
[style|design].[sass|css]

See merge request !69
2017-05-10 11:20:30 +02:00
klmp200 e59d769dac Doc for scss 2017-05-10 11:13:49 +02:00
klmp200 200af57971 Put scss in renderer 2017-05-10 10:49:34 +02:00
klmp200 f87ec1e395 Better lisibility for scss 2017-05-10 10:49:34 +02:00
klmp200 d083a67725 Change year of license on some files 2017-05-10 10:49:34 +02:00
klmp200 acef5be8b3 New lite home made scss processor 2017-05-10 10:49:34 +02:00
klmp200 630fdf93a4 Refactoring for compilestatic 2017-05-10 10:49:34 +02:00
klmp200 79c769351d Add simple way to compile scss files 2017-05-10 10:49:34 +02:00
klmp200 b23d322a29 Instruction for prod with scss 2017-05-10 10:49:34 +02:00
klmp200 ee7fd1c423 Rename temporary_design 2017-05-10 10:49:34 +02:00
krophil 2048f27d58 New temporary design 2017-05-10 10:49:34 +02:00
Skia b401efc6a5 Merge branch 'krophil' into 'master'
Add small explanation in subscriptions

See merge request !67
2017-05-10 10:42:32 +02:00
krophil 95d5907a3e Add translation 2017-05-10 10:37:49 +02:00
krophil 87c457498c Add small explanation in subscriptions 2017-05-10 10:32:30 +02:00
Skia 5920e0e52a Merge branch 'bugfix' into 'master'
Fix crash when no target_type specified on accounting

Il y a aussi d'autres commit que j'ai oublié de faire merge

See merge request !71
2017-05-07 19:43:55 +02:00
klmp200 2ef3c0260a Fix error on accounting when no target_type specified 2017-05-06 21:15:44 +02:00
klmp200 7cb9ea40ac Anonymous users can't edit weekmail 2017-05-06 20:48:48 +02:00
klmp200 5a7b743c83 Try fix right issues in counter admin 2017-05-06 20:48:48 +02:00
Skia 7c069bb3ee Merge branch 'weekmail' into 'master'
color to hexa and change email for weekmail

See merge request !70
2017-05-05 15:33:13 +02:00
krophil 635702b58f color to hexa and change email for weekmail 2017-05-05 15:28:53 +02:00
Skia ca4152aaf2 Reset right public key for Eboutic 2017-05-04 23:25:58 +02:00
Skia 778b7b22f2 Add Eboutic user guides and reference examples 2017-05-02 18:23:46 +02:00
Skia a12b772587 Add some Eboutic tests 2017-05-01 19:39:28 +02:00
Skia c7f48bd5f7 Fix counter view with no stock 2017-05-01 19:39:28 +02:00
Skia 58fdb36911 Merge branch 'Elections' into 'master'
Some tests for election

See merge request !47
2017-05-01 15:58:49 +02:00
Skia 8b1a19e2ff Delete django.mo file that reappeared with the stock app 2017-05-01 15:10:18 +02:00
klmp200 0b81d6a4c6 Merge branch 'weekmail' into 'master'
New css for weekmail

See merge request !68
2017-05-01 13:17:58 +02:00
krophil d7305488b6 Add new banner 2017-04-28 13:59:10 +02:00
krophil 7815796d8b New css for weekmail 2017-04-27 15:31:18 +02:00
Skia c0531feb27 Merge branch 'stock' into 'master'
Stock

See merge request !65
2017-04-25 16:17:24 +02:00
Skia a99cb3e0db Add header to stock files 2017-04-25 16:17:04 +02:00
klmp200 f2aadae8e8 Fix errors on election tests 2017-04-25 15:30:57 +02:00
klmp200 b5363c2987 Firsts tests for elections 2017-04-25 15:30:57 +02:00
Skia e26ad85729 Reset stock migrations 2017-04-25 09:49:05 +02:00
Skia 116aa6b8b5 Update stock URLs 2017-04-25 09:45:13 +02:00
Skia 423313f008 Update stock translations 2017-04-25 09:41:05 +02:00
Skia df20bf6dde Reindent stock app 2017-04-25 08:57:07 +02:00
Skia 20deda8a8e Merge branch 'master' into stock 2017-04-24 18:07:25 +02:00
Skia 83deae5964 Apply GPLv3 to Sith, and add header to every concerned file 2017-04-24 17:51:12 +02:00
Skia 8c82c27483 Add helpers in CONTRIBUTING 2017-04-24 17:35:55 +02:00
Skia 16b6b137d7 Merge branch 'krophil' into 'master'
Proposal for summary sending confirmation

See merge request !66
2017-04-19 11:06:19 +02:00
krophil 553b33c313 Proposal for summary sending confirmation 2017-04-19 11:01:56 +02:00
Skia 6a815e5a21 Small news improvement and bug fixes 2017-04-12 21:08:51 +02:00
Skia 44dacce9f2 Add forum signature 2017-04-12 19:38:54 +02:00
Skia 3aa5070a38 Add preview button in the Forum 2017-04-12 19:26:27 +02:00
Skia 830e94d73c Show that a message exists even if we can't see it 2017-04-10 23:27:34 +02:00
Skia 24c02f4638 Fix last message when the real last is deleted 2017-04-10 16:18:13 +02:00
Skia 9e61b11827 Mark all messages as read even if user can't see them 2017-04-10 15:33:49 +02:00
Skia cbfaf13536 Merge branch 'counter' into 'master'
Add CB sums in invoice calls

See merge request !64
2017-04-05 15:11:46 +02:00
klmp200 edc438bc0e More readability for sum 2017-04-05 15:08:11 +02:00
klmp200 6ca183ad55 Better sum writing 2017-04-05 14:23:51 +02:00
klmp200 53a2a160be Add CB refills sum 2017-04-05 13:48:43 +02:00
Skia ec8ee15d0e Merge branch 'bugfix' into 'master'
Serious counter fix

See merge request !62
2017-04-04 15:48:59 +02:00
klmp200 34f3fadd3d Rename counter mixin 2017-04-04 15:45:02 +02:00
klmp200 d4815df55f Better right counter management 2017-04-03 15:21:07 +02:00
klmp200 824411b13d Rights fix for counters 2017-04-03 13:50:28 +02:00
klmp200 1430479a1d Some rights fix 2017-04-03 11:57:28 +02:00
klmp200 5d89786c8f Serious counter fix 2017-04-03 10:46:53 +02:00
Skia a38d711c62 Merge branch 'bugfix' into 'master'
Hide start_date for non root user from clubs

See merge request !61
2017-04-03 09:47:48 +02:00
klmp200 fb09719317 Hide start_date for non root user from clubs 2017-04-03 09:41:35 +02:00
Skia 41c9f6381a Merge branch 'bugfix' into 'master'
Fix continuous tests

See merge request !60
2017-03-31 11:35:12 +02:00
Skia 231922cbaa Merge branch 'sas' into 'master'
Fixed some issues with filepaths and see the future with some preload

See merge request !59
2017-03-31 11:34:10 +02:00
klmp200 9f2566a244 Fix continuous integration 2017-03-30 22:18:03 +02:00
klmp200 60e2e0d4f9 Better to use os.path.join for paths 2017-03-30 19:13:47 +02:00
klmp200 1f844da005 Preload on sas 2017-03-28 18:46:10 +02:00
Skia 33e4cd6ca4 Merge branch 'bugfix' into 'master'
Better protection for stats

See merge request !58
2017-03-28 15:58:30 +02:00
klmp200 8787e5e708 Better protection for stats 2017-03-28 15:00:09 +02:00
Skia a078bae260 Merge branch 'bugfix' into 'master'
Fix broken accounting + security fixs

See merge request !57
2017-03-28 08:11:02 +02:00
klmp200 63506b1506 Protect stats from other users 2017-03-28 01:03:31 +02:00
klmp200 dfd465c7f9 Fix bug where customer can't buy an item when they have the just amount 2017-03-28 00:55:25 +02:00
klmp200 0d918d80d3 Avoid negative value in refilings 2017-03-28 00:34:58 +02:00
klmp200 ccd67e50b8 Avoid unothorised customer to buy in counter by modifying url 2017-03-27 23:28:06 +02:00
klmp200 5eb1e609cc Fixed tests issues 2017-03-27 22:47:24 +02:00
Skia 50413abf76 Fix a weekmail deleteview, and make some translate fix 2017-03-27 15:16:01 +02:00
Skia b28ce200e6 Fix some translations 2017-03-27 14:31:58 +02:00
Skia 3cf1628435 Fix weekmail new article link 2017-03-24 14:01:05 +01:00
Skia 39b32d456c Some com templates improvments and reordering some models 2017-03-24 09:19:15 +01:00
Skia d2da5716ba Automodere profile files 2017-03-24 08:43:13 +01:00
Skia e56b2476b7 Fix notifications local time 2017-03-17 18:11:30 +01:00
Skia 0887fe6c9e Arg, forgot another Ariadne's thread fix 2017-03-16 08:15:16 +01:00
Skia 825228cad6 Forum cosmetic 2017-03-15 19:24:01 +01:00
Skia 3993d17efe Fix forum Ariadne's thread 2017-03-15 18:35:15 +01:00
Skia f400be3a79 Refactor topic to use paginator instead of custom paging 2017-03-15 18:34:22 +01:00
Skia 701f23b539 Merge branch 'bugfix' into 'master'
forgotten o of shame (not for me)

See merge request !55
2017-03-15 08:15:17 +01:00
klmp200 cfcb671bf0 forgoten o of shame (not for me) 2017-03-14 19:09:12 +01:00
Skia 5e0f790247 Merge branch 'counter' into 'master'
Pagination for cash sumary

See merge request !53
2017-03-14 17:39:03 +01:00
klmp200 493d48bcca Pagination length in settings 2017-03-13 23:33:43 +01:00
klmp200 e4deacbe56 Pagination for cash sumary 2017-03-13 16:32:59 +01:00
Skia 3fd4d4b04b Merge branch 'Tresorerie' into 'master'
Tresorerie

Many modifications linked to the issue #23

See merge request !48
2017-03-12 23:05:44 +01:00
Skia 729a3608ba Add some pagination on forum topics 2017-03-12 20:40:37 +01:00
krophil 5932aad9fa Improve journal removing 2017-03-12 20:33:17 +01:00
krophil 5f9ec9a2ab Merge branch 'Tresorerie' of https://ae-dev.utbm.fr/ae/Sith into Tresorerie 2017-03-12 20:22:52 +01:00
Skia 65e2514df2 Small template fixes in forum 2017-03-12 18:31:35 +01:00
Skia a56d3a3088 Add a help_text to Weekmail edit form 2017-03-12 18:13:04 +01:00
Skia 73cbfd3e82 Add Forum ordering number 2017-03-12 18:06:01 +01:00
klmp200 0bf457de50 Hiding some already forbidden stuff 2017-03-11 11:57:37 +01:00
krophil 8329a19cc2 fix permissions 2017-03-11 11:57:37 +01:00
krophil 95775d3b9b adaptations for settings and deletion checked 2017-03-11 11:57:37 +01:00
klmp200 6c8671c160 Better club roles in settings 2017-03-11 11:57:37 +01:00
krophil 1acac17d7e Several modifications in accounting 2017-03-11 11:57:37 +01:00
krophil 8133db804e fix permission for companies 2017-03-11 11:57:37 +01:00
krophil 554929b4ec small fix in canViewList 2017-03-11 11:57:37 +01:00
Skia ffbad7e2e7 Merge branch 'wiki' into 'master'
Fix accents in wiki page name and allow to delete a page

See merge request !52
2017-03-08 14:37:59 +01:00
klmp200 95f984824a Fix accents in wiki page name and allow to delete a page 2017-03-08 14:11:56 +01:00
Skia b90d930594 Merge branch 'bugfix' into 'master'
No negative values for cash summary

See merge request !51
2017-03-03 00:04:47 +01:00
klmp200 158a140aa4 No negative values for cash summary 2017-03-01 10:21:57 +01:00
Skia 39b102d8aa README: add counting lines of code 2017-02-27 15:41:25 +01:00
krophil ebe76c83c7 fix permissions 2017-02-27 01:10:01 +01:00
krophil 9152688efd adaptations for settings and deletion checked 2017-02-26 18:04:58 +01:00
klmp200 92bc6cf96f Better club roles in settings 2017-02-26 18:04:58 +01:00
krophil c19e2d1cb0 Several modifications in accounting 2017-02-26 18:04:58 +01:00
krophil 346e07f0a8 fix permission for companies 2017-02-26 18:04:58 +01:00
krophil b3c2c79975 small fix in canViewList 2017-02-26 18:04:58 +01:00
klmp200 fa1a4599b6 Merge branch 'sas_right_fix' into 'master'
Sas right fix

See merge request !50
2017-02-26 17:38:20 +01:00
klmp200 86c74b22de Fix sas rights 2017-02-26 17:35:01 +01:00
klmp200 b02d72eab4 Fix debug-toolbar with jinja 2017-02-26 17:00:09 +01:00
Skia 7d99f02a4d forum: reply page, CSS, and first_unread fix 2017-02-25 14:38:10 +01:00
Skia 777fdd7bd5 Again, lot of forum improvements 2017-02-24 17:22:13 +01:00
Skia fe07ee0963 Still lot of forum improvements, both rights and cosmetic 2017-02-24 15:55:50 +01:00
Skia 10d96de385 Translations 2017-02-24 04:37:14 +01:00
Skia f262014f9b Some various forum fixes and improvements 2017-02-24 04:37:01 +01:00
Skia d6b5db4a4b Sanitize page name 2017-02-24 04:36:36 +01:00
Skia 4d6c4314e2 Bugfix with property/callable 2017-02-24 04:36:10 +01:00
Skia 801f6ec786 Translations and small fix in the forum 2017-02-24 03:28:44 +01:00
Skia aa07749a47 Reset forum migrations 2017-02-24 03:16:21 +01:00
Skia 59dfcbd567 Merge branch 'forum' into 'master'
Forum

See merge request !49
2017-02-24 03:08:07 +01:00
Skia dea234f98a Change is_subscriber and was_subscriber to cached_properties 2017-02-24 02:59:59 +01:00
Skia 11e05050f7 Fix tests and force Markdown renderer to escape HTML 2017-02-24 02:45:37 +01:00
Skia daee59f772 Change spans to sub and sup markups 2017-02-24 02:04:39 +01:00
Skia 5f1e4ebede Merge branch 'markdown' into forum 2017-02-24 02:02:59 +01:00
Skia 5897318cc6 Fix user picture view with Jinja update 2017-02-24 01:52:26 +01:00
Skia d3514e85f4 Fix settings to work with toolbar 2017-02-24 01:52:26 +01:00
Skia a4abf50d18 Allow former subscribers to see user profiles 2017-02-24 01:52:26 +01:00
Skia a4984317e9 Add Django debug toolbar 2017-02-24 01:52:22 +01:00
Skia 1e95fb6873 Make use of cached_property in User model 2017-02-24 01:50:14 +01:00
Skia c66b9b0512 Lot of small improvement in the forum 2017-02-24 01:50:09 +01:00
Skia 3b16704227 Add basic moderation to forum 2017-02-24 01:50:05 +01:00
Skia 138711c70c Some tiny fixes in the forum 2017-02-24 01:50:00 +01:00
Skia 6764224856 Fix quote answer and unread messages display 2017-02-24 01:49:48 +01:00
Skia aa93211025 Add support for editing album date 2017-02-21 14:29:58 +01:00
Skia 318c9ff9ad Add trigger to update Whoosh index on User update 2017-02-15 22:01:33 +01:00
Skia 52a671583e Fix blockquote 2017-02-07 00:10:00 +01:00
Skia ecbfe0822f Another version of the indice/exposants 2017-02-06 20:21:34 +01:00
Skia 579a68362d Add some rules 2017-02-06 20:21:34 +01:00
Skia 254126fd79 Add last unread function 2017-02-06 20:20:39 +01:00
Skia 494062fbbe Fix thumbnail generation for album upload view 2017-02-02 23:07:45 +01:00
Skia bf8a2a03ff Allow former subscribers to lookup people 2017-02-02 22:56:05 +01:00
Skia 4cc57c183e Add some better right management to forum 2017-01-28 20:58:54 +01:00
Skia 653d9d4707 Some other great forum improvements 2017-01-21 22:47:30 +01:00
Skia 93f5096140 Improve forum style and templates 2017-01-21 12:28:32 +01:00
Skia ff77df3646 Add basic right management to forum. Need to test it! 2017-01-21 04:51:37 +01:00
Skia 4dd6f01e60 Add Ariadne's thread 2017-01-21 04:19:15 +01:00
Skia ea52462217 Add Forum 2017-01-21 03:42:06 +01:00
Skia fcaa740710 Merge branch 'bilanTresorerie' into 'master'
small fix in pdf generation for operations

See merge request !46
2017-01-20 17:41:23 +01:00
krophil 6f48b4a2b0 small fix in pdf generation for operations 2017-01-20 16:00:02 +01:00
Skia 27e69fd3b8 Bad hack to fix Firefox broken autofocus 2017-01-18 19:09:58 +01:00
Skia e8b69defe7 Add report covers 2017-01-16 14:56:30 +01:00
Skia 4954c610f8 Add basic rights to weekmail 2017-01-15 23:09:30 +01:00
Skia ae0b7699f3 Finish weekmail, and fix preferences page 2017-01-15 23:02:03 +01:00
Skia 147809bb5d Some great weekmail improvements 2017-01-15 22:58:38 +01:00
Skia 83555a3640 Add preferences and improve weekmail 2017-01-15 22:58:38 +01:00
Skia d988c09315 Almost finish the weekmail 2017-01-15 22:58:38 +01:00
Skia 176b1bf588 Fix QuickNotifMixin 2017-01-15 22:58:37 +01:00
Skia 097d238962 Improve weekmail 2017-01-15 22:58:37 +01:00
Skia 0aef7656b8 Add quick notifications prototype 2017-01-15 22:58:37 +01:00
Skia 9d1eaed625 Make some weekmail views 2017-01-15 22:58:37 +01:00
Skia 8bd8191030 WIP: first Weekmail models 2017-01-15 22:58:37 +01:00
Skia d8c9575f88 Finish the report 2017-01-15 22:57:35 +01:00
Skia f6f78533e8 Almost finish the report 2017-01-15 22:57:35 +01:00
Skia 2d808e0724 Finish slides 2017-01-15 22:57:35 +01:00
Skia 3cac563389 Add first slides and continue report 2017-01-15 22:57:35 +01:00
guillaume-renaud 2ed566b75c Stock application report addition 2017-01-15 22:57:34 +01:00
Skia 9083dfb224 First TO report 2017-01-15 22:57:34 +01:00
Skia a826fd40a3 Small update on last operations view 2017-01-13 13:13:31 +01:00
guillaume-renaud 7d10c5d837 Forms initial quantity addition 2017-01-13 12:38:04 +01:00
Skia 93e51776c1 Merge branch 'eticketUpdate' into 'master'
partners banner added

See merge request !33
2017-01-13 08:58:15 +01:00
Skia 5a305354cb Add recursive option to file props form 2017-01-12 20:55:47 +01:00
Skia 9efd85d99b Update README with dependancies 2017-01-11 00:35:04 +01:00
Skia 881afd9e0a Improve SAS main view, and make some translations 2017-01-10 23:32:17 +01:00
Skia 3f6199f6c2 Merge branch 'Elections' into 'master'
Less precise election results

See merge request !45
2017-01-10 20:29:46 +01:00
klmp200 e3711533da Less precise election results 2017-01-10 19:06:34 +01:00
Skia 766d913afe Change SAS upload pool size 2017-01-09 13:05:50 +01:00
Skia cc2caf4ba1 Merge branch 'CR' into 'master'
Add CR 01.05

See merge request !43
2017-01-08 15:01:36 +01:00
guillaume-renaud 6f88d0cf8c Translations update 2017-01-08 11:46:25 +01:00
krophil 41b5be1fba Add CR 01.05 2017-01-07 17:39:47 +01:00
krophil 4a5d789d9f partners banner added 2017-01-07 17:39:21 +01:00
guillaume-renaud 539faccab2 Update shopping list history (ShoppingListItem creation) 2017-01-07 11:17:06 +01:00
Skia d400995e9d Update setup command to ease development 2017-01-07 10:36:54 +01:00
Skia 70aaf0b1c6 Merge branch 'CR' into 'master'
add CR

See merge request !42
2017-01-05 19:55:20 +01:00
krophil 83938a69dd add CR 2017-01-05 19:44:11 +01:00
Skia 57bb072008 Merge branch 'Tresorerie' into 'master'
Add benefit on sellings view

See merge request !41
2017-01-05 18:05:32 +01:00
klmp200 2c71c18d1b --amend 2017-01-05 18:02:02 +01:00
klmp200 86e3c09bae Add benefit on sellings view 2017-01-05 15:48:06 +01:00
guillaume-renaud 62200827c2 Finish back up app Stock 2017-01-05 11:24:54 +01:00
guillaume-renaud fa97929da8 Some classes defined twice -- correction 2017-01-05 11:24:26 +01:00
guillaume-renaud 8f88f7cb70 Take item from stock form addition 2017-01-05 11:16:25 +01:00
guillaume-renaud 2f721592f1 Update stock items quantity after shopping 2017-01-05 11:15:45 +01:00
guillaume-renaud 0660ea5e64 MAJ translations ; stock acces addition in user tool 2017-01-05 11:15:04 +01:00
guillaume-renaud 21c05cc779 Addition of the ShoppingList view to know the item to buy 2017-01-05 11:14:41 +01:00
guillaume-renaud 75af525945 Addition of the StockItem class
addition of Stock app, model, templates, urls

Addition of the stock parameter to the counter admin list

Fix translation files

Creation of the Stock list, edit, create views and creation StockItem create view

Stock application creation

Addition of the StockItem class

addition of Stock app, model, templates, urls

Addition of the stock parameter to the counter admin list

Fix translation files

Creation of the Stock list, edit, create views and creation StockItem create view

Initial StockItem create form value addition

general modifications

Stock admin gestion, items list views, create and edit items

remove stock_main.jinja

Stock application creation

Addition of the StockItem class

addition of Stock app, model, templates, urls

Addition of the stock parameter to the counter admin list

Fix translation files

Creation of the Stock list, edit, create views and creation StockItem create view

Addition of the StockItem class

addition of Stock app, model, templates, urls

Addition of the stock parameter to the counter admin list

Fix translation files

Creation of the Stock list, edit, create views and creation StockItem create view

Initial StockItem create form value addition

general modifications

Stock admin gestion, items list views, create and edit items

Shopping list structure view addition

correct missing endif

a

correct missing endif

Stock application creation

addition of Stock app, model, templates, urls

Addition of the stock parameter to the counter admin list

Fix translation files

Creation of the Stock list, edit, create views and creation StockItem create view

Stock application creation

addition of Stock app, model, templates, urls

Fix translation files

Creation of the Stock list, edit, create views and creation StockItem create view

Initial StockItem create form value addition

general modifications

Stock admin gestion, items list views, create and edit items

remove stock_main.jinja

Stock application creation

addition of Stock app, model, templates, urls

Addition of the stock parameter to the counter admin list

Fix translation files

Creation of the Stock list, edit, create views and creation StockItem create view

Fix translation files

Creation of the Stock list, edit, create views and creation StockItem create view

Initial StockItem create form value addition

general modifications

Shopping list structure view addition

correct missing endif
2017-01-05 11:07:34 +01:00
guillaume-renaud c6310c5315 correct missing endif 2017-01-05 11:07:05 +01:00
guillaume-renaud 5b2f126eee Shopping list structure view addition 2017-01-05 11:06:55 +01:00
guillaume-renaud 9d8264bcbb remove stock_main.jinja 2017-01-05 11:04:58 +01:00
guillaume-renaud 6c54b246ca Stock admin gestion, items list views, create and edit items 2017-01-05 11:04:12 +01:00
guillaume-renaud 5cb75ec3eb general modifications 2017-01-05 11:02:21 +01:00
guillaume-renaud 587ad96326 Initial StockItem create form value addition 2017-01-05 11:00:09 +01:00
guillaume-renaud 887893fb2d Creation of the Stock list, edit, create views and creation StockItem create view 2017-01-05 11:00:08 +01:00
guillaume-renaud ccb339b9bd Fix translation files 2017-01-05 11:00:08 +01:00
guillaume-renaud 29fb0af893 Addition of the stock parameter to the counter admin list 2017-01-05 11:00:08 +01:00
guillaume-renaud 33c7e7db9f addition of Stock app, model, templates, urls 2017-01-05 11:00:08 +01:00
guillaume-renaud fdfd7e7388 Addition of the StockItem class 2017-01-05 11:00:08 +01:00
guillaume-renaud 402a14d69a Stock application creation 2017-01-05 11:00:08 +01:00
Skia a90a553939 Some fixes on SAS upload form 2017-01-05 10:05:27 +01:00
Skia 72685618a6 Many right fix on counters 2017-01-04 19:39:37 +01:00
Skia 114272df2f Add simple club stats 2017-01-04 17:38:54 +01:00
Skia c48449cd50 Add barman stats 2017-01-04 17:38:09 +01:00
Skia dcd0c1fe75 Allow more than one bar if someone can connect to the counter 2017-01-04 16:14:17 +01:00
Skia 52a0913993 Tiny fix in the counter 2017-01-03 16:42:45 +01:00
Skia b347b87433 Many typo fixes and some updates in the TW report 2017-01-02 16:46:46 +01:00
Skia 0a9eb2fd33 Fix club tests 2016-12-29 01:30:37 +01:00
Skia fbb41c3cd5 Improve UX for accounting linked operation 2016-12-29 01:08:08 +01:00
Skia 17b4e24aaa Small club update 2016-12-29 00:42:26 +01:00
klmp200 2f2d5292de Some permissions fixs and security for atomic vote 2016-12-26 23:30:13 +01:00
Skia 729659e358 Don't ignore */static 2016-12-26 01:59:54 +01:00
Skia c6422fdd30 Add SYNTAX.md 2016-12-26 01:42:45 +01:00
Skia 1dd28672b0 Add Markdown test to populate 2016-12-26 01:36:07 +01:00
Skia f77856852d Working file:// link 2016-12-26 01:34:44 +01:00
Skia 323b946e1f First dfile:// parsing, not working into links, need to investigate 2016-12-26 01:34:44 +01:00
Skia 15e52d1ae8 Reset election migrations 2016-12-26 00:56:22 +01:00
Skia 78e00c3bd4 Merge branch 'Elections' into 'master'
Election app

See merge request !27
2016-12-26 00:45:40 +01:00
klmp200 3609952db5 Some translation fixs 2016-12-26 00:37:32 +01:00
Skia bf4d0693c6 Reformat templates to fit with the rest of the Sith 2016-12-26 00:10:41 +01:00
klmp200 61e67898e1 Coherent create/edit/delete templates for elections 2016-12-25 23:49:02 +01:00
klmp200 cd97901db1 Some date fix 2016-12-25 23:37:42 +01:00
klmp200 772a3b5827 Squashmigrations for elections 2016-12-25 22:09:59 +01:00
klmp200 5449a4fca2 Little permission fix 2016-12-25 22:04:31 +01:00
klmp200 e17fd22a37 Fix populate after rebase 2016-12-25 20:24:18 +01:00
klmp200 4d067165aa Election's trad 2016-12-25 20:09:18 +01:00
klmp200 c07f49305b Full CRUD for elections 2016-12-25 19:54:10 +01:00
klmp200 4f62863599 Pimp role and list forms and add edit for election 2016-12-25 19:54:10 +01:00
klmp200 d7387005c0 Better role creation 2016-12-25 19:54:10 +01:00
klmp200 02913d91e6 Refactors Candidate form 2016-12-25 19:54:10 +01:00
klmp200 9d9c86ea0f Refactored has_voted 2016-12-25 19:54:10 +01:00
klmp200 37decde04d Adds an S in electionS 2016-12-25 19:54:10 +01:00
Jean-Baptiste Lenglet da77c18871 Really display results when election is finished. 2016-12-25 19:54:10 +01:00
Jean-Baptiste Lenglet 64f5fef89f Display results only when the polls close 2016-12-25 19:54:10 +01:00
Jean-Baptiste Lenglet 1c761f9db2 Added results when the user is not voting 2016-12-25 19:54:10 +01:00
klmp200 e8d54764bd Add election results 2016-12-25 19:54:10 +01:00
Jean-Baptiste Lenglet baf39d8f3b Hide input if user can not vote 2016-12-25 19:54:10 +01:00
Jean-Baptiste Lenglet 9bb5951dac Removed request.user as user bc it already exists 2016-12-25 19:54:10 +01:00
Jean-Baptiste Lenglet 1a34dcdafe Changed plain form action to reversed URL. 2016-12-25 19:54:10 +01:00
Jean-Baptiste Lenglet fa9e4e5dc6 Tweaked Election view and added request.user as user 2016-12-25 19:54:10 +01:00
Jean-Baptiste Lenglet a9d154506f Added js validation for max_choice 2016-12-25 19:54:10 +01:00
klmp200 33d8c14da5 can_vote in Election 2016-12-25 19:54:10 +01:00
klmp200 2c76784007 Fixed Election.has_voted 2016-12-25 19:54:10 +01:00
Jean-Baptiste Lenglet 89362bae79 Hide inputs when user already voted. 2016-12-25 19:54:10 +01:00
Jean-Baptiste Lenglet dfcddbd1fa Hide election detail parts when user cannot candidate or edit. 2016-12-25 19:54:10 +01:00
Jean-Baptiste Lenglet a3a5a0446d Finished main view. Some tuning are to be done. 2016-12-25 19:54:10 +01:00
klmp200 9ac1cab983 Add vote in database 2016-12-25 19:54:10 +01:00
klmp200 97f835eb4e Convert indent with space, fix populate and add an s 2016-12-25 19:54:10 +01:00
klmp200 a27fd267d7 Remove useless methods on elections 2016-12-25 19:54:10 +01:00
klmp200 1f60fbd484 Uses election_detail for vote form 2016-12-25 19:54:10 +01:00
klmp200 938e2ce0a9 Fix rights in election 2016-12-25 19:54:10 +01:00
Skia 177e39bd6e Fix RuntimeWarning in populate 2016-12-25 19:54:10 +01:00
klmp200 67630fc9f8 Vote template 2016-12-25 19:53:04 +01:00
Jean-Baptiste Lenglet 9dbff0cd50 Finished election details. 2016-12-25 19:53:04 +01:00
Jean-Baptiste Lenglet 94d15684b7 Added profile pictures for users 2016-12-25 19:53:04 +01:00
Jean-Baptiste Lenglet 6784d66403 Building the new vote/display for a election. 2016-12-25 19:52:14 +01:00
Jean-Baptiste Lenglet 2095dd621e Reworked election list view with datetime ranges and a description. 2016-12-25 19:52:14 +01:00
Jean-Baptiste Lenglet e6b37ef332 Added date ranges in the elections list view. 2016-12-25 19:52:14 +01:00
klmp200 521b61517b Functionnal vote form 2016-12-25 19:52:14 +01:00
klmp200 e8ead338d0 Removed useless widget added previously + began voteform 2016-12-25 19:52:14 +01:00
klmp200 03754aba8a Can now add candidature 2016-12-25 19:52:14 +01:00
klmp200 51bb6c8472 Can add ElectionList and start of candidature form 2016-12-25 19:52:14 +01:00
klmp200 d72d8366cf Add new widget (not tested) and new bdd scheme for elections 2016-12-25 19:52:14 +01:00
klmp200 7956067686 Election right update 2016-12-25 19:52:14 +01:00
klmp200 2764f6d2d2 Refactor List Model 2016-12-25 19:52:14 +01:00
klmp200 c604282b77 Nice display for elections 2016-12-25 19:52:14 +01:00
klmp200 52e69b0ac1 Refactor elections 2016-12-25 19:52:14 +01:00
klmp200 a284637190 Normally fixs tests 2016-12-25 19:52:14 +01:00
klmp200 d14af8e452 New bdd arch 2016-12-25 19:52:14 +01:00
klmp200 fd3309fc5f Refactor election bdd 2016-12-25 19:52:14 +01:00
klmp200 135fa00e25 Fix database and add some view 2016-12-25 19:52:14 +01:00
klmp200 d685e9ba29 Election bdd + first view 2016-12-25 19:52:14 +01:00
Skia 0280a65623 Merge branch 'bilanTresorerie' into 'master'
Accounting tests

See merge request !37
2016-12-25 18:24:57 +01:00
krophil 16979aa3c1 tests for accounting 2016-12-25 12:09:32 +01:00
krophil 493148f761 new tests for operations 2016-12-24 16:16:14 +01:00
krophil f7b4258f20 populate updated 2016-12-24 16:16:14 +01:00
krophil 418537bc8e tests for accounting added 2016-12-24 16:16:14 +01:00
Skia df7b0a5ffe Clean migrations for news system 2016-12-24 02:12:46 +01:00
Skia b79c77f268 Add notification with a fresh new 2016-12-23 20:11:27 +01:00
Skia be44a3ab0b Add preview button to news 2016-12-23 19:43:59 +01:00
Skia 1dc1a0a42c Add news moderation tool 2016-12-23 18:40:37 +01:00
Skia c95e7565e7 Make news translations 2016-12-23 03:17:38 +01:00
Skia 1ca6bf7c62 Add news system, still miss nices templates and moderation tools 2016-12-23 03:02:46 +01:00
Skia f79ffbee7d Merge branch 'bilanTresorerie' into 'master'
Bilan tresorerie

See merge request !36
2016-12-21 20:24:49 +01:00
Skia b07b408ecf Fix statements 2016-12-21 13:09:40 +01:00
Skia f6d34baf59 Refactor statement by person, make it work 2016-12-21 05:42:33 +01:00
Skia 33ee449fb5 Make translations 2016-12-21 05:23:01 +01:00
Skia e6e4929eff Rename bilan to statement 2016-12-21 05:19:16 +01:00
Skia bdcc0bf6e9 Remake the statement by nature 2016-12-21 05:19:16 +01:00
krophil 6d756423d9 tabs added 2016-12-21 05:19:16 +01:00
krophil 93211d8ada operations added in populate 2016-12-21 05:19:16 +01:00
krophil 1457a7bf74 Bilan for accounting added 2016-12-21 05:19:16 +01:00
krophil 96c6bf8067 bilan added 2016-12-21 05:19:16 +01:00
krophil 5cd64fb384 bilan in development 2016-12-21 05:19:16 +01:00
krophil 6bb1e0e418 person bilan added and renamed classes 2016-12-21 05:19:16 +01:00
krophil 147287f9a9 Now, I understand how ORM works... or not 2016-12-21 05:19:16 +01:00
krophil bfa09c0bcd template added for bilan 2016-12-21 05:19:16 +01:00
Skia 168622a04d Add com app with first parametric texts 2016-12-21 02:38:21 +01:00
Skia 13785fd520 Prevent users that have never subscribed to subscribe on Eboutic 2016-12-20 23:27:54 +01:00
Skia 4edd535460 Change DateField to DateTimeField to improve indexing efficency 2016-12-20 16:28:30 +01:00
Skia bdd29a4d65 Allow quick index updates 2016-12-20 15:19:11 +01:00
Skia e66b274f0e Add index to search function 2016-12-20 14:46:08 +01:00
Skia 5b95299bde Add Whoosh index 2016-12-20 14:46:08 +01:00
Skia ac31c182c5 Merge branch 'companiesManagement' into 'master'
Management for companies added

See merge request !35
2016-12-20 14:39:54 +01:00
krophil c372b22197 Management for companies added 2016-12-20 12:29:13 +01:00
Skia 397778af1c Quick counter fix 2016-12-19 16:58:43 +01:00
Skia 68517a5d33 Merge branch 'Tresorerie' into 'master'
Separate counter for account refounding

See merge request !28
2016-12-19 16:50:44 +01:00
Skia 4ae4d2b6db Add overwrite mode and change compressed size width in picture resizing 2016-12-19 16:20:50 +01:00
Skia f09cea4033 Merge branch 'krophil' into 'master'
Signature and date added

See merge request !32
2016-12-19 11:35:40 +01:00
krophil 9567c8efca remove translations 2016-12-18 23:11:23 +01:00
Skia 352b8f0b4f Add recursive option to apply rights in the SAS 2016-12-18 19:08:25 +01:00
Skia dd2be2a31e Auto generate album thumbnails 2016-12-18 18:34:48 +01:00
Skia 94e740fb04 Small improvement in file prop view 2016-12-18 17:59:08 +01:00
Skia 9f35f74082 Huge performance improvement in SAS, miss the album thumbnail in most cases 2016-12-18 12:35:23 +01:00
Skia 4a7df31f5e Some other performance improvements 2016-12-18 11:55:45 +01:00
Skia bf6483039d Fix performance issue in rights check 2016-12-18 11:55:03 +01:00
Skia 8de0d54940 Allow to delete a launderette slot 2016-12-15 16:11:43 +01:00
Skia 57d8926a3f Improve SAS moderation interface 2016-12-15 13:10:05 +01:00
klmp200 7227a5d6f9 Refactor refounding function 2016-12-15 12:17:19 +01:00
klmp200 e231c612c6 Separate counter for account refounding 2016-12-15 11:46:36 +01:00
Skia 39b7349034 Add CSS to the notifications 2016-12-14 19:15:53 +01:00
Skia 81e11b4c33 Refactor Can*Mixin 2016-12-14 18:05:30 +01:00
Skia 642249e7fb Notification fix 2016-12-14 09:11:26 +01:00
Skia 97f7214f01 Small right fix 2016-12-14 09:10:41 +01:00
Skia d7a065c4e2 Update SAS rights 2016-12-13 18:36:08 +01:00
Skia e3c86c1d05 Add "Mark all as read" 2016-12-13 17:53:44 +01:00
Skia bf9aa29a54 Add clipboard to SAS 2016-12-13 17:17:58 +01:00
Skia f594a99751 Clean up, fix, and improve templates around clipboard 2016-12-13 01:24:23 +01:00
Skia 0859648bd4 Add cut/paste function in files 2016-12-13 00:45:38 +01:00
Skia 8b63fa9aea Store file moderator 2016-12-12 17:23:06 +01:00
Skia 2919f3a133 Allow former subscribers to see pictures 2016-12-12 16:35:52 +01:00
Skia 7be4f00440 Fix is_in_group 2016-12-11 17:51:44 +01:00
Skia 7ee4d36c3d Merge branch 'fixLaunderette' into 'master'
small fix for launderette

just a little fix for laverie. maybe I'm wrong

See merge request !29
2016-12-11 16:52:35 +01:00
krophil 77aa7d8561 small fix for launderette 2016-12-11 16:22:16 +01:00
Skia 28431ec9be Big refactor: remove Subscriber class 2016-12-10 01:58:30 +01:00
Skia 0d4b697079 Refactor group settings 2016-12-10 01:29:56 +01:00
Skia 1649d14518 Fix migration scripts 2016-12-10 00:30:52 +01:00
Skia d92a706920 Refactor notifications 2016-12-10 00:06:17 +01:00
Skia b53531c391 Add another method to moderate pictures in SAS 2016-12-09 19:35:23 +01:00
Skia 66d73d69ec Improve SAS moderation page 2016-12-09 18:42:02 +01:00
Skia 4542753812 Add two tests for file upload 2016-12-09 15:48:17 +01:00
Skia a02d5a65cb Improve a bit SAS moderation 2016-12-09 15:46:47 +01:00
Skia 80fa99d2ac Add notification 2016-12-08 19:47:28 +01:00
Skia c1397ef5a5 Small fix, episode two 2016-12-08 15:30:41 +01:00
Skia 9847186b06 Small fixes 2016-12-08 15:16:42 +01:00
Skia d2c580dd81 Close issue #26: improve SAS ergonomy 2016-12-06 13:53:16 +01:00
Skia b7b9820d70 Revert "Père 200, Père 200, tralalalalère!!!!"
This reverts commit edaa1b0082.
2016-12-06 12:37:25 +01:00
Skia edaa1b0082 Père 200, Père 200, tralalalalère!!!! 2016-12-05 02:58:53 +01:00
Skia 3970965781 Merge branch 'Tresorerie' into 'master'
Refound Account

See merge request !26
2016-11-30 15:44:43 +01:00
Skia 8771cc9b86 Enhance user picture view 2016-11-30 12:59:03 +01:00
Skia 7453b857fb Add thumbnails to albums 2016-11-30 09:28:54 +01:00
Skia 7e335cfbd7 Update rotating function 2016-11-30 09:28:53 +01:00
klmp200 3c8a4f068e Refound Account 2016-11-30 08:19:52 +01:00
Skia 00feca44d8 Merge branch 'krophil' into 'master'
pdf generation for operations

See merge request !21
2016-11-29 12:38:18 +01:00
krophil 0b4f826594 Add PDF operations generation 2016-11-29 12:35:37 +01:00
Skia a60063f009 Oops, syntax error + styling footer 2016-11-29 11:49:41 +01:00
Skia 7f0561234f SAS fixes 2016-11-29 11:35:31 +01:00
Skia 7969e9ba5f Update SAS migration script 2016-11-29 11:29:53 +01:00
Skia 47cb5e60ce Merge branch 'juste' into 'master'
First footer + css improvements

Just little improvements such as a footer and deletion of border-radius on log header, it's rather a first try.

See merge request !13
2016-11-29 11:28:49 +01:00
Skia c1861755bc Translation update 2016-11-29 11:26:18 +01:00
juste ff9ed9002e a simple footer + traductions 2016-11-28 11:26:06 +01:00
Skia 064abe0741 UTF-8 fix 2016-11-25 18:59:22 +01:00
Skia cfbb6f4e1f Lot of small improvement in SAS 2016-11-25 13:47:09 +01:00
Skia 0b23d39e15 Fix migrations after rebase 2016-11-23 11:55:10 +01:00
Skia b8c9aa4e7f WIP: Begin SAS migration script 2016-11-23 11:46:45 +01:00
Skia 9bccc6a5d1 Small fix in the JS 2016-11-23 11:46:45 +01:00
Jean-Baptiste Lenglet e66d9bd472 Added asynchronous image upload. 2016-11-23 11:46:45 +01:00
Skia 1c5e658e4b Remove shitty AJAX upload 2016-11-23 11:46:45 +01:00
Skia da35292cd5 Add is_in_sas field, to perform queries on it 2016-11-23 11:46:45 +01:00
Skia 5481a79f64 WIP: AJAX upload 2016-11-23 11:46:45 +01:00
Skia 0e788dd876 Small refactoring 2016-11-23 11:46:45 +01:00
Skia 0e0e57458f Improve SAS UX 2016-11-23 11:46:45 +01:00
Skia 7dff98d853 Small template improvements 2016-11-23 11:46:45 +01:00
Skia f900db0dd2 Make SAS translations 2016-11-23 11:46:45 +01:00
Skia 815ef03860 Better handle rotations 2016-11-23 11:46:45 +01:00
Skia 869634d6e1 Add thumbnail generation 2016-11-23 11:46:45 +01:00
Skia 71d22e367b Add picture view to users 2016-11-23 11:46:45 +01:00
Skia 22ab21e4e1 Add picture-people relation and ask for removal thing 2016-11-23 11:46:45 +01:00
Skia b619619b85 Improve moderation tool in SAS 2016-11-23 11:46:45 +01:00
Skia e681cc65fe Add SAS moderation tool 2016-11-23 11:46:45 +01:00
Skia 157b1e4c78 Add file moderation tool 2016-11-23 11:46:45 +01:00
Skia 5ea41de91d WIP SAS 2016-11-23 11:46:45 +01:00
Skia 585ba55e5e Continue SAS 2016-11-23 11:46:40 +01:00
Skia d554a5ee8d Begin SAS 2016-11-23 11:38:01 +01:00
Skia 0b068d3e92 Improve file moderation 2016-11-23 11:30:57 +01:00
Skia 9e32840549 Add file moderation tool 2016-11-23 00:51:20 +01:00
Skia 02be5e1629 Protect query on Eboutic to prevend double basket validation 2016-11-22 17:04:12 +01:00
Skia cfbd610305 Revert "Merge branch 'fond-gala' into 'master'"
This reverts merge request !25
2016-11-21 14:10:29 +01:00
Skia 98d47727e0 Merge branch 'fond-gala' into 'master'
Add background for gala 2016

See merge request !25
2016-11-13 23:38:13 +01:00
klmp200 d418da679b Add background for gala 2016 2016-11-13 22:55:32 +01:00
Skia e98ffb5cd5 Fix unappropriate behavior when delete selling 2016-11-10 13:51:56 +01:00
Skia 11c263b6e7 Hotfix: better handle atomicity in eboutic basket validation 2016-11-10 00:35:13 +01:00
Skia 9f4f3bf436 Fix CI 2016-11-08 19:27:04 +01:00
Skia e9c19438d4 Fix tests and CI 2016-11-08 19:07:25 +01:00
Skia 321dead0de Translation updates, and make the binary compiled translation file ignored 2016-11-08 18:56:57 +01:00
guillaume-renaud 57b663c4c5 counter inactive state with settings variable, traduction file problem fixed 2016-11-08 18:48:27 +01:00
guillaume-renaud 7f6424d51e Fix the number of minutes for a counter to be inactive to 10 2016-11-08 18:47:50 +01:00
guillaume-renaud 0d6b93d085 Add inactive state for counters 2016-11-08 18:47:40 +01:00
guillaume-renaud be7e0401dd Fix the number of minutes for a counter to be inactive to 10 2016-11-08 18:42:31 +01:00
guillaume-renaud 63f10c13d4 Add inactive state for counters 2016-11-08 18:42:12 +01:00
Skia ba6e2c3712 Merge branch 'sli' into 'master'
Download sellings as csv

See merge request !24
2016-11-08 15:00:58 +01:00
klmp200 2dd2189314 Download sellings as csv 2016-11-08 14:57:09 +01:00
Skia fa57d6cd63 Merge branch 'diagramUpdate' into 'master'
Diagram update

See merge request !23
2016-11-07 23:23:14 +01:00
krophil 4527407b93 final correction 2016-11-07 01:53:32 +01:00
krophil 9d8d86dd47 Correction on graphs 2016-11-07 01:53:32 +01:00
krophil 66b4f06c34 graphs corrected 2016-11-07 01:53:32 +01:00
krophil fa98339bcd new diagrams added 2016-11-07 01:53:32 +01:00
Skia 7e71ffcb75 Merge branch 'sli' into 'master'
Fix company display for operation creation

See merge request !22
2016-11-06 23:38:42 +01:00
klmp200 5d5f2522c4 Fix company display for operation creation 2016-11-06 23:34:38 +01:00
Skia 54d3ca8e65 Merge branch 'sli' into 'master'
Edit CONTRIBUTING instructions

See merge request !20
2016-11-06 23:27:00 +01:00
klmp200 160c7806df Fix contributing.md and fix quantity display on eticket 2016-11-06 23:15:43 +01:00
Skia 20ff409547 Fix tests 2016-11-06 11:36:54 +01:00
Skia 59f5917b8c Fix Page locking 2016-11-05 13:37:39 +01:00
klmp200 d0cd8a8997 Fix the contributing fix 2016-11-04 00:45:10 +01:00
klmp200 b6966c9502 Add number of places on ebticket 2016-11-04 00:43:28 +01:00
klmp200 ea0eb89410 Edit CONTRIBUTING instructions 2016-11-04 00:38:49 +01:00
krophil c0c8b295ba Update CONTRIBUTING.md 2016-11-03 19:58:58 +01:00
krophil 2f8b069118 Update CONTRIBUTING.md 2016-11-03 19:57:41 +01:00
Skia ea85d26cdd Almost revert "Add link to create club in rootplace"
Keep the links, but revert and fix the translation file

This reverts commit 029bc7cc7c.
2016-11-03 11:52:04 +01:00
Skia 9cfc029fb2 Permission fix 2016-10-27 18:39:40 +02:00
Skia 6251e38668 Tiny translation fix 2016-10-26 20:01:05 +02:00
Skia 7fe0964ae1 Merge branch 'sli' into 'master'
Add automatic mail when an eticket has been bought

See merge request !19
2016-10-26 19:03:05 +02:00
klmp200 677c50a4b1 Add unknown event translation 2016-10-25 21:53:40 +02:00
klmp200 bafa9ac10c Small fix for auto-mail about eticket 2016-10-25 18:25:59 +02:00
klmp200 b00fc23fc4 Add automatic mail when an eticket has been bought 2016-10-21 17:47:56 +02:00
Skia 3e99f97b7a Merge branch 'sli' into 'master'
Add ban for alcohol



See merge request !17
2016-10-21 11:00:40 +02:00
Skia 933afd4fb7 Update eboutic main template 2016-10-19 21:30:41 +02:00
klmp200 224374f5e8 More readable user_account 2016-10-19 01:57:54 +02:00
klmp200 029bc7cc7c Add link to create club in rootplace 2016-10-18 23:36:26 +02:00
klmp200 c40171fe86 Clean permission check for alcohol and counter ban 2016-10-18 23:02:53 +02:00
Skia 47c01d6d10 Fix request in cash summary list 2016-10-18 14:48:47 +02:00
klmp200 2daaf992f2 Add groups, allow to ban users from counters and from buying alcohol 2016-10-16 03:45:06 +02:00
klmp200 1c97c8a74f Swag dropdown on user account + autofocus for refillings on counters 2016-10-16 02:47:21 +02:00
klmp200 132bae72a7 Fix club account name display for clubs 2016-10-16 00:23:13 +02:00
klmp200 c9005e2c31 Fix for etickets 2016-10-15 19:58:51 +02:00
klmp200 ba86219b74 Translations for alcool ban 2016-10-15 19:58:32 +02:00
klmp200 257cb9cfe7 Add ban for alcohol 2016-10-15 02:33:38 +02:00
Skia a0319887c8 Merge branch 'sli' into 'master'
Deny date of birth, first and last name modification for non board or root user



See merge request !16
2016-10-13 23:24:12 +02:00
klmp200 178a4af196 Add lazy way to make an user property editable once only 2016-10-13 22:58:26 +02:00
klmp200 579c25d63a Deny date of birth, first and last name modification for non board or root user 2016-10-13 22:32:13 +02:00
Skia 5931351c0a Another tiny template improvement 2016-10-12 12:32:04 +02:00
Skia 0d8bebcd80 Tiny template update 2016-10-10 18:43:40 +02:00
Skia 13265e6a0d Allow more control on the dates for cash summaries sums 2016-10-10 18:29:13 +02:00
Skia 31d62532be Merge branch 'sli' into 'master'
Add account number and suscription on counter



See merge request !15
2016-10-09 16:08:48 +02:00
klmp200 d285fbe04a Add account number and suscription on counter 2016-10-08 23:07:10 +02:00
Skia c66d61ee85 Merge branch 'LoJ' into 'master'
Lo j : Addition of the user's club page

When a user check his profile, he can access a new tab "Clubs" to see his currents and olds Clubs

See merge request !14
2016-10-07 13:36:35 +02:00
guillaume-renaud 5b50cc9598 Traduction's addition for user_clubs templates 2016-10-07 13:17:43 +02:00
guillaume-renaud 760b33728b Addition of the user's club tab as table 2016-10-06 11:08:32 +02:00
guillaume-renaud 1b63d58586 Addition of the user's club tab 2016-10-06 11:08:32 +02:00
Skia 0acc97fa90 Fix operation create view 2016-10-05 20:17:37 +02:00
Skia 63217b2ead Improve product display 2016-10-05 15:57:04 +02:00
Skia 7fdcb0c815 Finish labels in accounting 2016-10-05 15:54:11 +02:00
Skia e169e4ff6f Update .gitlab-ci.yml, try to fix CI 2016-10-04 11:26:20 +02:00
Skia 64b4484620 Some templating 2016-10-04 00:41:08 +02:00
Skia deeb2b5b6f Migrate and fix etickets 2016-10-04 00:32:07 +02:00
Skia cd23fdf3ef Add missing eticket banner 2016-10-03 19:43:22 +02:00
Skia d6138a7a0c Make the etickets 2016-10-03 19:30:05 +02:00
Skia a12f9dd53e Fix club sellings 2016-10-03 13:55:20 +02:00
Skia 2ef5a4d37b Runtime error fix 2016-09-30 18:43:53 +02:00
Skia ca3b7fda5a Improve invoice call template 2016-09-29 18:34:58 +02:00
Skia 51f342a7d3 Add invoices calls 2016-09-29 18:19:58 +02:00
Skia ddceb82abf Display uncategorized products 2016-09-29 16:19:05 +02:00
Skia 52184c4012 Merge branch 'sli' into 'master'
Godfathers deletion



See merge request !11
2016-09-29 15:12:19 +02:00
klmp200 2c6f17063a Can delete Godfathers 2016-09-29 15:06:39 +02:00
Skia db07b54ed1 Allow the counter admin to edit cash registers summaries 2016-09-29 14:54:03 +02:00
Skia c2276dab2b Remove useless mixin 2016-09-29 12:53:09 +02:00
klmp200 a008f34288 Fix bug where slots appears when slot expired 2016-09-28 17:22:34 +02:00
Skia 2e7e78b8ce Add last ops view to the bars 2016-09-28 11:09:54 +02:00
Skia fd482195f8 Merge branch 'sli' into 'master'
AutoCompleteSelectField on clubs



See merge request !10
2016-09-28 10:59:13 +02:00
klmp200 8ef45bf03c Rename is_token to check_token 2016-09-28 10:53:27 +02:00
klmp200 1c6df0909b Fixes double check on board member in club view 2016-09-28 10:46:06 +02:00
klmp200 17b098ca2a Fixed lookup for loged barmen 2016-09-27 22:57:06 +02:00
klmp200 17b483bd21 AutoCompleteSelectField on clubs 2016-09-27 21:05:57 +02:00
Skia f152791d90 Merge branch 'sli' into 'master'
Only club members can view counter's stats

N'importe qui peut accéder aux tops 100, c'est pas très cool de voir ce que dépensent les autres…

See merge request !9
2016-09-27 20:12:57 +02:00
klmp200 3c408551aa Remove nested exception for stats and added property on AnonymusUser 2016-09-27 16:56:30 +02:00
klmp200 f7722ed564 Fixed permissions on stats 2016-09-27 16:44:12 +02:00
klmp200 f22f2cbde6 Only club members can view counter's stats 2016-09-26 23:56:24 +02:00
Skia 303db0bc7d Translation and explicit string 2016-09-26 11:31:45 +02:00
Skia a4ad7f0e85 Add token to counter to see pictures and to prevend misuses 2016-09-26 11:17:56 +02:00
Skia 37072e1640 Clean up some useless prints 2016-09-26 11:17:55 +02:00
Skia 7a2985b186 Add product top 10 2016-09-26 11:17:55 +02:00
Skia 24d744ee9c Merge branch 'krophil' into 'master'
Krophil

Few changes in css

See merge request !7
2016-09-26 09:25:13 +02:00
Skia 4749c45c97 Merge branch 'sli' into 'master'
Hided launderette slots and tokens for non authorized users and added is_office and is_launderette



See merge request !8
2016-09-26 09:23:35 +02:00
klmp200 380f41445a Modify property names 2016-09-22 13:07:22 +02:00
klmp200 e250acf82d Used settings for office and launderette 2016-09-22 13:00:00 +02:00
Skia ffd4dac2e2 Allow club staff to delete their sellings 2016-09-22 12:52:15 +02:00
Skia ae6a613f9a Add promo_17.png 2016-09-21 15:41:12 +02:00
Skia 9e4e9597d1 Add the merge user function 2016-09-21 14:09:26 +02:00
klmp200 748ad1c5c2 Fixed some mistakes 2016-09-21 14:01:44 +02:00
klmp200 2d16b9c296 Hided launderette slots and tokens for non authorized users and added is_office and is_launderette 2016-09-21 13:33:02 +02:00
Skia f1e54439e1 Small stats fix 2016-09-21 12:19:34 +02:00
Skia 324bd69312 Small templates fixes 2016-09-20 20:38:12 +02:00
krophil 1d9c058132 Revert "radius removed"
This reverts commit 26a1300417.
2016-09-20 17:12:09 +02:00
krophil 521c2f2afb Merge branch 'krophil' of https://ae-dev.utbm.fr/ae/Sith into krophil 2016-09-20 13:23:36 +02:00
krophil 62c4036dee radius removed 2016-09-20 13:22:05 +02:00
krophil b11c5bbd1d Merging 2016-09-20 13:19:44 +02:00
krophil 4ee858c130 README updated 2016-09-20 13:18:05 +02:00
Skia 1e0904b48e Merge branch 'sli' into 'master'
Quick fix to hide account number in profile page when not owner user or root

Faut vite cacher les numéros de compte des gens à qui ils n'apartiennent pas, sinon c'est la faille de sécu D:

See merge request !6
2016-09-19 20:43:33 +02:00
Skia 5b83aff351 Small UI fix 2016-09-19 20:40:38 +02:00
Skia d88da0abd8 Make translations for godfathers 2016-09-19 20:32:30 +02:00
Skia 5ba2ab925d Add godfathers 2016-09-19 20:29:43 +02:00
krophil 26a1300417 radius removed 2016-09-19 11:20:37 +02:00
klmp200 584025acf0 Quick fix to hide account number in profile page when not owner user or root 2016-09-18 22:50:10 +02:00
Skia 95b22cafe0 Template fixes 2016-09-15 11:51:05 +02:00
Skia 35d811317c Add top 100 to counters 2016-09-15 11:07:03 +02:00
Skia 6aaeb7cdc9 Rename membership to memberships 2016-09-15 11:06:51 +02:00
Skia 3d9dfbc43a Fix gitignore 2016-09-14 13:46:43 +02:00
Skia f29e5ecabb Fix static files for dev 2016-09-14 13:46:17 +02:00
Skia 64761a83ed Don't come with MySQL by default 2016-09-14 13:19:56 +02:00
Skia 6cf253365b Add cash register summary view 2016-09-13 02:04:49 +02:00
Skia b0ce448ec7 Add missing translation 2016-09-12 17:38:35 +02:00
Skia 09f61eb61c Only root can create a new launderette 2016-09-12 17:35:25 +02:00
Skia 6cacfb8d8d Add counter activity 2016-09-12 17:34:33 +02:00
Skia c748bb8450 Fix slow selling page in clubs 2016-09-12 17:34:17 +02:00
Skia b63923d956 Refactor settings 2016-09-12 14:04:50 +02:00
Skia 54444b31ba Some template improvements 2016-09-11 19:00:12 +02:00
krophil 07363c607b Few proposals in CSS 2016-09-11 14:53:55 +02:00
krophil 1b728e3a8b README updated 2016-09-11 14:53:55 +02:00
Skia 7aec32cef0 Some quick improvement on account view 2016-09-09 20:38:27 +02:00
Skia 5e26e5bde7 Merge branch 'sli' 2016-09-09 19:56:48 +02:00
Skia 5b5006892d Make sellings for clubs 2016-09-09 16:23:35 +02:00
Skia 90e47c9d7d Add a restriction on the counter login view to authorize only the sellers 2016-09-09 01:54:26 +02:00
klmp200 2f7dc9ec19 Used lambda function in user detail 2016-09-08 04:15:34 +02:00
klmp200 41d5a02d77 Fixed account order and detail account view 2016-09-08 03:38:28 +02:00
klmp200 8d060af46c Removed wierd hack 2016-09-08 03:21:39 +02:00
Skia 4c2bf9cbf9 Launderette and product list fixes 2016-09-08 02:09:17 +02:00
klmp200 bca8dc039a Added macros for slots and tokens display 2016-09-07 23:06:38 +02:00
klmp200 61c77a7877 Added address on profile 2016-09-07 02:07:01 +02:00
klmp200 c0296b9ada Added slots on user profile 2016-09-07 01:51:34 +02:00
klmp200 a64b10776e Monthly user account 2016-09-06 22:13:48 +02:00
klmp200 78bf4b7b84 Fixed markdown api issue 2016-09-06 21:59:13 +02:00
Skia d23e07363d Fix settings 2016-09-04 19:26:50 +02:00
Skia b1f6754e6e Refactor lots of tabed templates, and create TabedViewMixin 2016-09-04 19:25:03 +02:00
Skia 976ae09e55 Fix subscriptions with Sith account 2016-09-04 18:35:20 +02:00
Skia 4503fae287 Merge branch 'sli' into 'master'
Fixed get_age



See merge request !3
2016-09-04 16:54:30 +02:00
klmp200 80549c7a33 Fixed get_age 2016-09-04 16:26:02 +02:00
Skia e1ce661a04 Improvements in counter admin templates 2016-09-04 15:50:43 +02:00
Skia d93dda1c0e Merge branch 'sli' into 'master'
Fixed old database bug in dev env



See merge request !2
2016-09-04 15:00:16 +02:00
klmp200 b0215e7445 Organized settings 2016-09-04 14:56:47 +02:00
klmp200 5ca8a22123 Fixed Settings 2016-09-04 14:19:56 +02:00
Skia 25dea832be Display bar list with "openness" 2016-09-04 14:17:49 +02:00
klmp200 8328e668bd Fixed old database bug in dev env 2016-09-02 21:24:10 +02:00
Skia c62d3f4f4a Add old membership views 2016-09-02 21:21:57 +02:00
Skia c5fd9d0076 Small template fixes 2016-09-02 19:31:47 +02:00
Skia a0b1fa32e7 Fix subscription form 2016-09-02 12:29:50 +02:00
Skia bae34c4b1c Fix double user creation 2016-09-02 09:47:33 +02:00
Skia 29f565f514 Improve club templates 2016-09-02 09:23:21 +02:00
Skia b2df8fbf18 Fix LoginForm 2016-09-01 17:50:13 +02:00
Skia 3239a2e481 Fix counter if no date of birth 2016-09-01 16:55:43 +02:00
Skia d27f62dca9 Small fixes 2016-09-01 16:43:21 +02:00
Skia f7e3251ae5 Right fix and translation 2016-09-01 11:27:00 +02:00
Skia a4c5d48159 Some bug fixes 2016-09-01 10:00:31 +02:00
Skia 1f31d3b56f Send a mail when someone is subscribed 2016-08-31 18:40:17 +02:00
Skia 6af16cc893 Some basic templating 2016-08-31 17:18:21 +02:00
Skia 37d303634c Fix form with files 2016-08-31 15:29:16 +02:00
Skia a47cca1b1e Very small CSS improvement 2016-08-31 04:08:28 +02:00
Skia 0db7180d43 Do some user profile templating 2016-08-31 04:04:28 +02:00
Skia 55ea2ac763 Change link color 2016-08-31 03:32:55 +02:00
Skia 4a29a431af Display user amount without the account page 2016-08-31 03:25:26 +02:00
Skia f66b999f24 Improve login form 2016-08-31 02:44:46 +02:00
Skia fcfbfb3a0b Small file fix 2016-08-31 02:05:04 +02:00
Skia cb90ab8e57 Fix link to old site 2016-08-30 17:41:42 +02:00
Skia b21d9f6ff2 Add price for subscriptions 2016-08-30 17:33:45 +02:00
Skia 9cfdf4798d Fix OperationEditView 2016-08-29 20:13:53 +02:00
Skia e8713b3c22 Merge remote-tracking branch 'origin/api' 2016-08-29 19:50:38 +02:00
Skia fe2438ef0c Fix subscription right and typo 2016-08-29 19:48:29 +02:00
Skia 3305a19f44 Fix permissions on sellings and refillings 2016-08-29 16:07:14 +02:00
Skia 3667a12174 Fix webcam upload 2016-08-29 04:58:25 +02:00
Skia c4b1494eee Update settings 2016-08-29 03:34:43 +02:00
Skia f0499cdb26 Make a better index page 2016-08-29 03:25:47 +02:00
Skia 4215baec26 Make the bar menu 2016-08-29 03:14:53 +02:00
Skia 325da79e45 Add support for subscription typed products in eboutic 2016-08-29 03:02:13 +02:00
Skia dfb13c37f2 Add INSERT to old DB for subscriptions and users 2016-08-29 02:19:29 +02:00
Skia 2b4a623e4a First link to old site's DB 2016-08-29 01:34:08 +02:00
Skia e61b5e7690 Small fixes 2016-08-29 01:31:58 +02:00
Skia b2f13e935e Add missing migration 2016-08-26 23:31:25 +02:00
Skia 3e0b964e9b Small AnonymousUser fix (le gaulois) 2016-08-26 21:09:32 +02:00
Skia 01c3991988 Add cash register summaries 2016-08-26 20:57:04 +02:00
Skia 9927310f6e Update login system to support the multiple threads of UWSGI 2016-08-26 20:56:16 +02:00
Skia b33c3b20bb Add account check to migration 2016-08-26 18:34:49 +02:00
Skia ce7230751e Fix email sending by setting password to all migrated users + refactor migrate.py 2016-08-25 17:43:28 +02:00
Skia bea7b71f2c Delete unwanted obsolete migration files 2016-08-24 22:10:58 +02:00
Skia 4f67bf4c04 Reset all migrations and migrate companies 2016-08-24 22:09:23 +02:00
Skia fb8e7ceb5b Some templating and migration fix 2016-08-24 21:49:46 +02:00
Skia 078b63d970 Migrate accounting 2016-08-24 19:50:22 +02:00
Skia a4df1ae9a5 Add language chooser 2016-08-24 19:11:09 +02:00
Skia f2c3c7dc25 Add viewable flag for user 2016-08-22 18:44:03 +02:00
Skia eef5dfd275 Make JPEG progressive when resizing 2016-08-22 14:21:17 +02:00
Skia 8e3eb1e2bf Some templating and add webcam support for profile editing 2016-08-22 02:56:27 +02:00
Skia 4cbfd58660 Add pictures to products 2016-08-21 03:07:15 +02:00
Skia a49d9850ab Pimp the counter click view 2016-08-21 02:30:49 +02:00
Skia 7797f87dd0 Clean up some useless prints 2016-08-20 22:15:54 +02:00
Skia dbf0653baf Add support for product buying groups + many cosmetics and form pimping 2016-08-20 22:12:46 +02:00
Skia 00f05c71c5 Fix migrate script 2016-08-20 16:10:16 +02:00
Skia d54f0f4c65 At last we support trays! 2016-08-20 16:09:46 +02:00
Skia 62745e89fa User profile template fix 2016-08-20 13:57:27 +02:00
Skia 84efcd87e7 Translate datepicker and add age limit to products 2016-08-20 02:55:48 +02:00
Skia 7e90e657a7 Add ajax-select app and improve some templates 2016-08-19 23:24:23 +02:00
klmp200 2f7030d964 Fixed api's list bug 2016-08-19 17:25:23 +02:00
klmp200 6c107ed3d4 Splited api across sevral files, deactivated readonly 2016-08-19 16:13:40 +02:00
klmp200 cc619daf45 Renaming and commenting in api 2016-08-19 14:41:33 +02:00
Skia bfb2dc5f82 Kinda fix the refilling migration: there were some traps! 2016-08-19 14:39:28 +02:00
klmp200 8455ff3f7b Turned the api readonly and fixed permissions on it 2016-08-19 12:37:30 +02:00
Skia da96e9da84 Search improvement 2016-08-19 03:12:20 +02:00
Skia f1105d704e Add basic search bar 2016-08-19 02:53:44 +02:00
Skia 0689f864d2 Migrate permanencies and add user stats view 2016-08-18 21:32:18 +02:00
Skia b69c3a6792 Improve and fix user accounts 2016-08-18 21:06:10 +02:00
Skia 05bd177a9d Migrate invoices and lot of eboutic improvements 2016-08-18 19:52:20 +02:00
Skia 50c452c287 Fix migrate script 2016-08-18 03:06:46 +02:00
Skia 84364d9018 Improve counter app and migrate products/producttypes/refillings/sellings 2016-08-18 03:04:50 +02:00
Skia d4f87e7581 Improve file popup 2016-08-15 21:04:06 +02:00
Skia 66fdf6cbf7 Migrate and improve subscriptions 2016-08-14 19:28:14 +02:00
Skia e1474c7a74 Add is_root property to user 2016-08-14 04:35:08 +02:00
Skia 792563999b Allow root to reset user password 2016-08-13 17:15:45 +02:00
Skia a033c4dfd2 Improve launderette rights to match with launderette club 2016-08-13 16:39:09 +02:00
Skia 4ec328556e Migrate clubs 2016-08-13 16:08:22 +02:00
Skia 2e9fa1a27d Begin migration script 2016-08-13 05:33:24 +02:00
Skia c0a66f9a38 Finish profile of users 2016-08-13 05:33:09 +02:00
Skia 5113d8fda5 Small user profile fix 2016-08-11 04:57:07 +02:00
Skia 43b709bfd5 Make file modale chooser and complete user profile 2016-08-11 04:30:24 +02:00
Skia a8858fa781 Add home for users and clubs 2016-08-10 16:23:12 +02:00
Skia 830c15a585 Better right handling in files 2016-08-10 14:48:18 +02:00
Skia 1775569ecf Reset all migrations 2016-08-10 13:52:57 +02:00
Skia 792d66da33 Add nice whole file support 2016-08-10 05:48:06 +02:00
Skia 6fbf607492 Fix settings 2016-08-08 00:35:35 +02:00
klmp200 cefb3828bc Started launderette API 2016-08-08 00:33:02 +02:00
klmp200 bfa966e3d8 Birthday API and some more enhacements 2016-08-07 22:57:38 +02:00
klmp200 8e8ee808b5 Fixed api permissions 2016-08-07 20:52:53 +02:00
klmp200 2822d947d9 Enhaced API : look for permissions, automaticly add /{pk}/id, added
users, groups and clubs
2016-08-07 20:45:06 +02:00
Skia 1a6373e9ce Add barman list in API 2016-08-07 20:45:06 +02:00
klmp200 b9ea687df1 Fixed comment 2016-08-07 20:45:06 +02:00
klmp200 c2ccf63021 Added counters in api 2016-08-07 20:45:06 +02:00
klmp200 feb7b4689b First steps with the api 2016-08-07 20:45:06 +02:00
Skia ad36c1c6f6 Better handle 403 with next argument 2016-08-07 20:36:06 +02:00
Skia a0f7150c55 Update accounting to have a target 2016-08-07 20:10:50 +02:00
Skia d824d0d928 Uppercase some choices in settings 2016-08-07 20:06:47 +02:00
Skia 1529af32c5 Add token handling form in launderette 2016-08-06 15:20:38 +02:00
Skia 31ecb50c1d Move user account view into core 2016-08-05 09:52:19 +02:00
Skia aa17c44bcc Add location when subscribing 2016-08-05 00:51:04 +02:00
Skia 260a17ae4f Improve generation of account id 2016-08-05 00:51:04 +02:00
Skia 44a6621aac Update settings 2016-08-04 13:36:33 +02:00
Skia 70e723337d Update settings 2016-08-02 22:32:13 +02:00
Skia db712c86b8 Fix tests 2016-08-02 22:20:06 +02:00
Skia 7002139176 Finish the launderette click view 2016-08-02 00:32:55 +02:00
Skia 2cf39671e2 Make some more validation on the token click form 2016-08-01 19:59:22 +02:00
Skia 4d8e7b0875 Improve launderette, need to finish the click view 2016-08-01 16:36:16 +02:00
Skia ba48adab6d Improve launderette plannings and admin part 2016-07-29 13:00:32 +02:00
Skia fc170cfc49 Delete unwanted templates 2016-07-29 12:17:11 +02:00
Skia ef17e66351 Improve launderette plannings 2016-07-29 01:38:46 +02:00
Skia a01fc63a82 Begin launderette 2016-07-28 20:05:56 +02:00
Skia 4c62816816 Add rights to Product and Product Type views 2016-07-28 16:11:18 +02:00
Skia 3c4a9a89a8 Fix README 2016-07-28 13:02:10 +02:00
Skia e3705f9fe2 Make sliding subscriptions for 1 or 2 semesters 2016-07-28 12:41:29 +02:00
Skia 80f72df1de Add product type management views 2016-07-27 20:05:45 +02:00
Skia f230fbc135 Add product management views 2016-07-27 17:23:02 +02:00
Skia 4408890ab2 Templating and translation 2016-07-27 00:13:20 +02:00
Skia 4e6b592911 Fix eboutic 2016-07-26 19:58:36 +02:00
Skia 45f5a58b4a Improve Eboutic basket 2016-07-26 19:39:19 +02:00
Skia c099f1c5d7 Make eboutic working 2016-07-26 18:28:36 +02:00
Skia 60e606b370 Improve ET auto answer view 2016-07-26 15:10:48 +02:00
Skia d837b624e2 Implement parts of the ET API 2016-07-24 18:26:03 +02:00
Skia 0ecb78a101 Fix some counter stuff 2016-07-22 13:34:34 +02:00
Skia 256651f580 Translation fix 2016-07-22 02:20:13 +02:00
Skia a0322fa931 Templating pages 2016-07-22 02:05:29 +02:00
Skia f04cf9d4d4 Add basics of eboutic, still need to implement the ET API to get bank payment 2016-07-22 01:19:50 +02:00
Skia 525d7e6709 Add atomic transaction in counters 2016-07-22 01:19:04 +02:00
Skia 1f3e186e27 Update counters and some views 2016-07-21 20:03:56 +02:00
Skia 724f3d8d6f Templates and views 2016-07-21 12:09:57 +02:00
Skia 28aa143f39 Improve Operation numbering in accounting 2016-07-20 18:48:18 +02:00
Skia 150147c69f Fix the removing of built in permissions for admin app 2016-07-20 16:34:18 +02:00
Skia 7a267dbc3f Create the customer when subscribing if it does not exists yet 2016-07-20 00:28:49 +02:00
Skia 97ff4341a7 Translate most of the Sith 2016-07-19 19:03:16 +02:00
Skia 1b4324f38f Add french translation file 2016-07-18 17:47:43 +02:00
Skia beebe6361c Update gitlab-ci.yml to change ln to cp 2016-07-18 13:27:47 +02:00
Skia 46eb659d7d Update gitlab-ci.yml to fix the builds with new settings.py 2016-07-18 13:24:31 +02:00
Skia 2147f6a468 Add permanencies tracking to counters 2016-07-18 13:22:50 +02:00
Skia 593050d9e2 Improve greatly the counter right management 2016-07-18 00:47:56 +02:00
Skia e92a73dfb1 Add basic account view for user and refactor user tool bar 2016-07-17 12:38:02 +02:00
Skia c099cc489b Improve refilling form to handle the checks and the banks 2016-07-17 11:38:19 +02:00
Skia 14595936e2 Some design 2016-07-17 11:37:52 +02:00
Skia 4498877283 Small fix on counters 2016-07-16 16:48:56 +02:00
Skia f600e174b1 CSS and templating, Sith begins to look nice 2016-07-16 16:35:45 +02:00
Skia 171303cfcc Delete settings.py 2016-07-14 17:55:02 +02:00
Skia 67114f51e1 Fix populate to work with Postgres 2016-07-14 17:51:26 +02:00
Skia e29e94711a Move settings to settings_sample 2016-07-14 16:15:38 +02:00
Skia 0eb203b18b Fix populate with subscriptions 2016-07-14 16:13:43 +02:00
Skia 0248bdf6d1 Update SubscriptionForm to allow creating user on the fly 2016-07-07 00:52:30 +02:00
Skia bab3a38a2e Small subscription fix 2016-07-06 01:32:41 +02:00
Skia 5355492c76 Date of birth is no longer mandatory 2016-07-06 01:09:31 +02:00
Skia 1feea061f6 Add basic refill support 2016-06-26 20:07:29 +02:00
Skia 9989b75b3e Add string parser in counters 2016-06-26 19:30:28 +02:00
Skia 9429dbccc2 Add link to counters in club tools 2016-06-26 18:15:23 +02:00
Skia 50efc07eaa Add basic close journal functions 2016-06-24 21:55:52 +02:00
Skia e9544f2581 Update CanCreateView and fix accounting views in consequence 2016-06-24 21:07:59 +02:00
Skia 1396f2ca84 Improve accounting ease of use 2016-06-24 19:59:49 +02:00
Skia ace58f54b5 Update Doxyfile 2016-06-22 14:52:53 +02:00
Skia e25c4a4e4a Add some TODOs 2016-06-22 13:40:30 +02:00
Skia d244618dd0 Improve accounting views 2016-06-22 13:19:35 +02:00
Skia d06540086d Small orhtograph fix 2016-06-21 11:52:45 +02:00
Skia 95a3dd02e1 Add final PDF report 2016-06-21 00:49:20 +02:00
Skia 3a746d010a Finish the report 2016-06-21 00:47:11 +02:00
Skia 13461268d0 Add license 2016-06-21 00:42:33 +02:00
Skia 3023d6d744 Add CanCreateMixin, and add amount in journals 2016-06-20 15:47:26 +02:00
Skia 18db95cfd2 Update again the report 2016-06-20 12:24:44 +02:00
Skia 109e23cee0 Update report, again 2016-06-20 00:01:26 +02:00
Skia aa92bc9467 Update report 2016-06-19 21:16:04 +02:00
Skia 12b361be70 Update report 2016-06-18 18:06:57 +02:00
Skia 4ca431877e Update report 2016-06-17 14:55:55 +02:00
Skia e5d60b8c72 Begin report 2016-06-17 14:55:55 +02:00
Skia aafcc9c174 Almost finish the counter views, still need the plateaux 2016-06-02 14:55:12 +02:00
Skia b6904ad88c WIP: Improve counters view (counter is broken for now) 2016-06-02 00:26:31 +02:00
Skia ffe2aec980 Implement barman prices and improve counter views 2016-06-01 01:33:20 +02:00
Skia 6c48b7c718 Add Selling and Refilling classes 2016-05-31 19:32:15 +02:00
Skia 356a2d2683 Refactor page handling 2016-05-31 13:00:52 +02:00
Skia 8da149c979 Some refactoring between accounting and counter 2016-05-31 13:00:52 +02:00
Skia e75da927c3 Improve group views 2016-05-31 13:00:52 +02:00
Skia ac37d3328c Merge branch 'undefined' into 'master'
Added data model for the BdF app.



See merge request !1
2016-05-10 10:54:49 +02:00
Skia b388b96da8 Fix club test 2016-05-10 10:52:16 +02:00
Skia 27805640a1 Improve right handling for accounting 2016-05-09 11:49:01 +02:00
François Brachais 1b974c6d45 Added data model for the BdF app. 2016-05-07 18:47:59 +02:00
Skia 39661b8de7 Add new club view 2016-05-03 12:06:03 +02:00
Skia 6ef39257ee Fix user template 2016-05-03 09:01:54 +02:00
Skia 6e05207e84 "Finish" the accounting views 2016-05-03 08:50:54 +02:00
Skia 9c0b17a9ae Fix custom special views 403,404 to return the right HTTP code 2016-05-02 11:33:38 +02:00
Skia 08ae6a19bc Remove setup step from CI, it was not needed 2016-04-20 03:33:03 +02:00
Skia b4c3f2f4dc Fix tests 2016-04-20 03:30:49 +02:00
Skia e5c085c706 Add setup step to CI 2016-04-20 03:05:23 +02:00
Skia 5fcb3e1412 Add basic accounting views 2016-04-20 03:01:14 +02:00
Skia c6a3559bf5 Improve accounting model according to current site's one 2016-04-20 02:07:01 +02:00
Skia 9a135ade50 Refactor counters view a bit, and protect ClickView if no barman is logged 2016-04-19 19:58:57 +02:00
Skia 6eb0ec1620 Tiny fix (le gaulois) 2016-04-19 03:43:13 +02:00
Skia 25c1e6dc58 Add the basket handling in the click view of the counter
Now there is still to handle the validation by generating the appropriate invoice(s)
2016-04-19 01:54:55 +02:00
Skia 7a9689a20d Improve the click view, the total is computed, but there is still a lot of work 2016-04-18 17:34:21 +02:00
Skia 1f98993871 It worked, really deleting APT lines! We have now CI! :) 2016-04-18 05:09:23 +02:00
Skia 8bc19d8e73 New CI test, without APT 2016-04-18 05:06:16 +02:00
Skia 785e34b2d6 Add CI file, testing 2016-04-18 04:58:15 +02:00
Skia a5118ef457 Finish the functionnality of CounterMain
We now redirect correctly to CounterClick, providing a valid user
2016-04-18 04:37:37 +02:00
Skia 478d1ed876 Continue the counter views 2016-04-15 11:50:31 +02:00
Skia c1a151d754 Add timeout for barmen 2016-04-12 13:08:37 +02:00
Skia 20a97526d4 Make counter login forms 2016-04-12 10:00:47 +02:00
Skia 3302fdc6f2 Small club fix 2016-04-12 10:00:15 +02:00
Skia e4070c86fd Add contacts 2016-04-07 10:44:34 +02:00
Skia 52153438ac Rename and refactor some settings 2016-03-31 10:36:00 +02:00
Skia be826ed616 Add the Guide to the Tresorerie 2016-03-30 18:33:21 +02:00
Skia debba55350 Add MetaGroup system 2016-03-29 12:45:10 +02:00
Skia 5bcc94f992 Improve counters views 2016-03-29 10:30:48 +02:00
Skia 21f1393097 Add basic counter model 2016-03-28 14:54:35 +02:00
Skia 7d7652e319 Small fix (le gaulois) 2016-03-24 11:55:39 +01:00
Skia c3fb581f97 Refactor a bit right handling 2016-03-22 17:46:26 +01:00
Skia 18f856af24 Small right fix 2016-03-22 12:00:57 +01:00
Skia 2e84ee7d4f Fix subscription and improve views 2016-03-22 11:42:00 +01:00
Skia 0dba76e02e Make some tests for clubs 2016-03-22 09:01:24 +01:00
Skia 6aed36c31f Add club migration 2016-03-21 17:49:22 +01:00
Skia fe8f5bb2e3 Fix club rights 2016-03-15 18:26:03 +01:00
Skia d90c0f86f4 Update requirements.txt 2016-03-10 13:53:40 +01:00
krophil bad581fec7 jumplines 2016-03-07 13:36:06 +01:00
krophil bdc164e1ac Jumplines 2016-03-07 13:34:22 +01:00
krophil ed8f5856d4 Tuto updated 2016-03-07 13:31:38 +01:00
krophil d5c44d6be6 Initialize contribution guide 2016-03-07 13:11:48 +01:00
Skia e2b0668ee8 Improve Club views 2016-02-08 17:09:52 +01:00
Skia a14d940db2 Some refactoring and misc improvements 2016-02-05 16:59:42 +01:00
Skia ed080b76a2 WIP: Club member form 2016-02-04 08:59:03 +01:00
Skia d51ab088d8 Add first club views, this still sucks, particularly on the right managment 2016-02-02 16:34:36 +01:00
Skia afc87888a6 Finish the move to Jinja2 2016-02-02 11:00:08 +01:00
Skia 239133e355 Fix generate_username for accents 2016-02-02 10:59:00 +01:00
Skia 6b81210ba1 Fix permissions Mixins 2016-02-02 10:15:50 +01:00
Skia 03bc0973fe WIP: Move to Jinja2 2016-02-01 17:35:55 +01:00
Skia abb8dc0c5e Add Subscription to setup 2016-02-01 09:55:23 +01:00
Skia bc7ab19e86 Update README 2016-01-29 16:29:24 +01:00
Skia 7f163ffc9e Add Doxyfile for generating doc 2016-01-29 16:23:41 +01:00
Skia 4322318c31 Club model implementation, various other changes 2016-01-29 15:20:00 +01:00
Skia 7f4955d15c Update diagramm 2016-01-29 09:45:59 +01:00
Skia 8fc360a977 Improve subscription and add it to admin app 2016-01-28 17:42:22 +01:00
Skia f71ce2f7df Add first accounting implementation 2016-01-28 16:53:37 +01:00
Skia 2b999d87ba Another date field update 2016-01-28 10:13:45 +01:00
Skia 367fddbdab Alter date_of_birth 2016-01-28 09:36:24 +01:00
Skia 8ea1727475 Fix URLs 2016-01-11 10:13:30 +01:00
Skia 8b0939ca79 Core: rename full_name in _full_name because this attribute is for internal use only 2016-01-11 10:02:41 +01:00
Skia 1f4c49ac49 Make a previsualization button in page edit 2016-01-11 09:56:42 +01:00
Skia 771056d6e4 Add a begining of API and CSS+JS (static files folder) 2016-01-08 17:11:38 +01:00
Skia f5b07887a5 Fix typo in setup 2016-01-08 16:27:59 +01:00
Skia 8ebd6c64a7 Add Markdown support and better url tolerance for pages 2016-01-08 16:15:06 +01:00
Skia b35483d2a9 WIP: Begin ae app with subscription handling 2015-12-15 17:50:50 +01:00
Skia a6aac76d75 Alter date_join field in User 2015-12-15 09:27:50 +01:00
Skia 787fd2f484 Settingize some stuff and add custom AnonymousUser 2015-12-14 15:43:30 +01:00
Skia a6edfcc048 Update UserPropForm 2015-12-14 10:49:15 +01:00
Skia 376b5101c1 Add docstring to PageRev 2015-12-09 11:22:50 +01:00
Skia 268a33255b Refactor user groups to user prop 2015-12-09 11:01:11 +01:00
Skia 77803596fb Add class wide permissions and clean up migrations 2015-12-09 10:33:55 +01:00
Skia e3cbe70319 WIP: Improve many views and a bit user permissions (idea for class scale perm) 2015-12-08 17:22:50 +01:00
Skia 475bff14cb Refactor rights handling 2015-12-08 11:10:29 +01:00
Skia dc37e79f14 WIP: Refactor permissions 2015-12-08 09:46:48 +01:00
Skia f7bfd6daed Add getattribute to PageRev for getting owner_group&co 2015-12-08 09:46:40 +01:00
Skia aa732a4ec0 WIP: Add custom 403 and 404, but break a bit the permissions! To be fixed 2015-12-07 17:23:52 +01:00
Skia 6cc7851487 Repair all tests and update requirements.txt 2015-12-07 16:08:24 +01:00
Skia 185b35ed18 Improve setup script 2015-12-04 16:14:05 +01:00
Skia 078276cead Merge branch 'sli' 2015-12-03 20:36:53 +01:00
Skia 2557af270a Merge branch 'krophil' 2015-12-03 20:33:40 +01:00
klmp200 e750b5a12f Edited gitignore and README to make everything work proprely with virtualenv 2015-12-03 20:29:07 +01:00
krophil f3896cb22e SimpleTestCase -> TestCase. Now, test are almost ok 2015-12-03 18:41:22 +01:00
Skia 2c4bac7c9f Add setup custom command to manage.py 2015-12-03 18:00:08 +01:00
Skia 5f07237d70 Improve a bit user views's rights 2015-12-03 16:47:03 +01:00
Skia 50f53e7a6e Fix users tests and pages fixtures 2015-12-02 17:14:47 +01:00
Skia f17fb6e466 Add lock handling in Wiki 2015-12-02 16:43:40 +01:00
Skia 92f68f5b42 Add complete revision and history handling in the wiki 2015-12-02 11:09:50 +01:00
Skia 80926dd4ac Revert "Begin a PageRevision implementation, but this breaks currently everything!"
This reverts commit 979fc7bcb7.
2015-11-30 13:04:46 +01:00
Skia 979fc7bcb7 Begin a PageRevision implementation, but this breaks currently everything! 2015-11-27 16:40:16 +01:00
Skia edcbf7a367 Update fixture and PagePropFrom 2015-11-27 16:09:47 +01:00
Skia 0b962e2380 Make the group management more generic in the model 2015-11-27 16:05:43 +01:00
Skia 5c9e5a24ab Implement generic right checking for any View with the right parents 2015-11-27 15:39:42 +01:00
Skia b19ec084b6 Basic group view and permissions management on the pages 2015-11-26 17:40:31 +01:00
Skia 48e3f88b87 Improve user views 2015-11-26 16:32:56 +01:00
Skia 385f91a9db Add a missing template 2015-11-26 11:27:52 +01:00
Skia 431b81cd42 Make all the lost password procedure 2015-11-26 10:57:26 +01:00
Skia 6e54fa075e WIP: password change/reset forms 2015-11-25 17:03:18 +01:00
Skia 04bbf0db5b Refactor login and logout with built-in views 2015-11-25 16:20:28 +01:00
Skia b237cdbaae Refactor page view with Django's black magic powered DetailView&co 2015-11-25 14:45:18 +01:00
Skia d72b18c120 Add basic page view permission, not really working 2015-11-25 10:29:25 +01:00
Skia 5b8b3746e6 Update README 2015-11-25 08:47:35 +01:00
Skia cdcf4099fc Prevent loop in Wiki 2015-11-24 20:09:44 +01:00
Skia 18115a0dc4 Put view into a module 2015-11-24 16:09:46 +01:00
Skia ebcdcf4245 Basic user profile edit form 2015-11-24 15:52:27 +01:00
Skia 259182c1c4 Add page properties view 2015-11-24 14:01:10 +01:00
Skia 7b093f6fbd Fix page table integrity 2015-11-24 14:00:41 +01:00
Skia ce8ceb80d6 Update README again 2015-11-24 10:57:30 +01:00
Skia 611779ce76 Update README 2015-11-24 10:55:15 +01:00
Skia 9a9541088d Fix wiki, plus clean up and add tests 2015-11-24 10:53:16 +01:00
Skia 8753e020a1 Wiki is working quit well 2015-11-23 17:32:31 +01:00
Skia d2005ff997 Almost working wiki before refactoring again 2015-11-23 17:23:37 +01:00
Skia ace66bba0a Almost working wiki before refactoring 2015-11-23 13:30:30 +01:00
Skia e9c18748b0 Make date of birth mandatory 2015-11-22 18:23:21 +01:00
Skia c434e093a0 Update diagrams 2015-11-20 16:21:51 +01:00
Skia 6253c06235 Add very basic and not safe pages 2015-11-20 15:47:01 +01:00
Skia c6b35071db Amend: add migration file 2015-11-19 17:36:05 +01:00
Skia c877fa7b84 Fix default date of birth with aware timezone 2015-11-19 17:34:11 +01:00
Skia 7a65215bb5 Basic user permissions for user editing 2015-11-19 16:33:40 +01:00
Skia d3896ad676 Update login system and add tests 2015-11-19 14:44:48 +01:00
Skia 5ee2baedba Add registering tests 2015-11-19 11:23:08 +01:00
Skia 898490324a Basic user profile 2015-11-19 09:46:05 +01:00
Skia c8680ec87d Update README.md 2015-11-19 08:47:24 +01:00
Skia 6c8f2c5555 Add README 2015-11-19 08:45:21 +01:00
Skia 619e27eb52 Basic auth system 2015-11-18 17:09:06 +01:00
Skia 5bd40b2ec4 First commit: basic users 2015-11-18 09:44:06 +01:00
715 changed files with 102156 additions and 381733 deletions
+17
View File
@@ -0,0 +1,17 @@
[run]
source = .
branch = False
omit =
*test*
*/migrations/*
doc/*
env/*
sith/toolbar_debug.py
sith/wsgi.py
migrate.py
[report]
show_missing = False
include = *.py
[html]
title = Sith Code Coverage
directory = coverage_report
+15
View File
@@ -0,0 +1,15 @@
db.sqlite3
*.log
*.pyc
*.mo
*__pycache__*
.DS_Store
.vscode/
env/
doc/html
data/
/static/
sith/settings_custom.py
sith/search_indexes/
.coverage
coverage_report/
+26
View File
@@ -0,0 +1,26 @@
stages:
- test
test:
stage: test
script:
- apt-get update
- apt-get install -y gettext python3-xapian
- pushd /usr/lib/python3/dist-packages/xapian && ln -s _xapian* _xapian.so && popd
- export PYTHONPATH="/usr/lib/python3/dist-packages:$PYTHONPATH"
- python -c 'import xapian' # Fail immediately if there is a problem with xapian
- pip install -r requirements.txt
- pip install coverage
- ./manage.py compilemessages
- coverage run ./manage.py test
- coverage html
- coverage report
artifacts:
paths:
- coverage_report/
black:
stage: test
script:
- pip install black
- black --check .
-3576
View File
File diff suppressed because it is too large Load Diff
+106
View File
@@ -0,0 +1,106 @@
*Contribuer c'est la vie*
=========================
Hey ! Tu veux devenir un mec bien et en plus devenir bon en python si tu l'es pas déjà ?
Il se trouve que le sith AE prévu pour l'été 2016 a besoin de toi !
Pour faire le sith, on utilise le framework Web [Django](https://docs.djangoproject.com/fr/1.11/intro/)
N'hésite pas à lire les tutos et à nous demander (ae.info@utbm.fr).
Bon, passons aux choses sérieuses, pour bidouiller le sith sans le casser :
Ben en fait, tu peux pas le casser, tu vas juste t'amuser comme un petit fou sur un clone du sith.
C'est pas compliqué, il suffit d'avoir [Git](http://www.git-scm.com/book/fr/v2), python et pip (pour faciliter la gestion des paquets python).
Tout d'abord, tu vas avoir besoin d'un compte Gitlab pour pouvoir te connecter.
Ensuite, tu fais :
`git clone https://ae-dev.utbm.fr/ae/Sith.git`
Avec cette commande, tu clones le sith AE dans le dossier courant.
```bash
cd Sith
virtualenv --system-site-packages --python=python3 env
source env_sith/bin/activate
pip install -r requirements.txt
```
Attention aux dépendances système, à voir dans le README.md
Maintenant, faut passer le sith en mode debug dans le fichier de settings personnalisé.
```bash
echo "DEBUG=True" > sith/settings_custom.py
echo 'EXTERNAL_RES = "False"' >> sith/settings_custom.py
echo 'SITH_URL = "localhost:8000"' >> sith/settings_custom.py
```
Enfin, il s'agit de créer la base de donnée de test lors de la première utilisation
```bash
./manage.py setup
```
Et pour lancer le sith, tu fais `python3 manage.py runserver`
Voilà, c'est le sith AE. Il y a des issues dans le gitlab qui sont à régler. Si tu as un domaine qui t'intéresse, une appli que tu voudrais développer, n'hésites pas et contacte-nous.
Va, et que l'AE soit avec toi.
# Black
Pour uniformiser le formattage du code nous utilisons [Black](https://github.com/ambv/black). Cela permet d'avoir le même codestyle et donc le codereview prend moins de temps. Tout étant dans le même format, il est plus facile pour chacun de comprendre le code de chacun ! Cela permet aussi d'éviter des erreurs (y parait 🤷‍♀️).
Installation de black:
```bash
pip install black
```
## Sous VsCode:
Attention, pour VsCode, Black doit être installé dans votre virtualenv !
Ajouter ces deux lignes dans les settings de VsCode
```json
{
"python.formatting.provider": "black",
"editor.formatOnSave": true
}
```
## Sous Sublime Text
Il faut installer le plugin [sublack](https://packagecontrol.io/packages/sublack) depuis Package Control.
Il suffit ensuite d'ajouter dans les settings du projet (ou en global)
```json
{
"sublack.black_on_save": true
}
```
Si vous utilisez le plugin [anaconda](http://damnwidget.github.io/anaconda/), pensez à modifier les paramètres du linter pep8 pour éviter de recevoir des warnings dans le formatage de black
```json
{
"pep8_ignore": [
"E203",
"E266",
"E501",
"W503"
]
}
```
Sites et doc cools
------------------
[Classy Class-Based Views](http://ccbv.co.uk/projects/Django/1.11/)
Helpers:
`./manage.py makemessages --ignore "env/*" -e py,jinja`
`for f in $(find . -name "*.py" ! -path "*migration*" ! -path "./env/*" ! -path "./doc/*"); do cat ./doc/header "$f" > /tmp/temp && mv /tmp/temp "$f"; done`
+2320
View File
File diff suppressed because it is too large Load Diff
+674
View File
@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+21
View File
@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2016 Skia
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+102
View File
@@ -0,0 +1,102 @@
[![pipeline status](https://ae-dev.utbm.fr/ae/Sith/badges/master/pipeline.svg)](https://ae-dev.utbm.fr/ae/Sith/commits/master)
[![coverage report](https://ae-dev.utbm.fr/ae/Sith/badges/master/coverage.svg)](https://ae-dev.utbm.fr/ae/Sith/commits/master)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)
[![project chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://ae-dev.zulipchat.com)
## Sith AE
### Get started
To start working on the project, just run the following commands:
```bash
git clone https://ae-dev.utbm.fr/ae/Sith.git
cd Sith
virtualenv --system-site-packages --python=python3 env
source env/bin/activate
pip install -r requirements.txt
./manage.py setup
```
To start the simple development server, just run `python3 manage.py runserver`
### Logging errors with sentry
To connect the app to sentry.io, you must set the variable SENTRY_DSN in your settings custom. It's composed of the full link given on your sentry project
### Generating documentation
There is a Doxyfile at the root of the project, meaning that if you have Doxygen, you can run `doxygen Doxyfile` to
generate a complete HTML documentation that will be available in the *./doc/html/* folder.
### Dependencies:
See requirements.txt
You may need to install some dev libraries like `libmysqlclient-dev`, `libssl-dev`, `libjpeg-dev`, `python3-xapian`, or `zlib1g-dev` to install all the
requiered dependancies with pip. You may also need `mysql-client`. Don't also forget `python3-dev` if you don't have it
already.
You can check all of them with:
```bash
sudo apt install libmysqlclient-dev libssl-dev libjpeg-dev zlib1g-dev python3-dev libffi-dev python3-dev libgraphviz-dev pkg-config python3-xapian
```
On macos, you will need homebrew
```bash
brew install xapian
```
If it doesn't work it's because it need [this pull request](https://github.com/Homebrew/homebrew-core/pull/34835) to be validated.
The development is done with sqlite, but it is advised to set a more robust DBMS for production (Postgresql for example)
### Collecting statics for production:
We use scss in the project. In development environment (DEBUG=True), scss is compiled every time the file is needed. For production, it assumes you have already compiled every files and to do so, you need to use the following commands :
```bash
./manage.py collectstatic # To collect statics
./manage.py compilestatic # To compile scss in those statics
```
### Misc about development
#### Controlling the rights
When you need to protect an object, there are three levels:
* Editing the object properties
* Editing the object various values
* Viewing the object
Now you have many solutions in your model:
* You can define a `is_owned_by(self, user)`, a `can_be_edited_by(self, user)`, and/or a `can_be_viewed_by(self, user)`
method, each returning True is the user passed can edit/view the object, False otherwise.
This allows you to make complex request when the group solution is not powerful enough.
It's useful too when you want to define class-wide permissions, e.g. the club members, that are viewable only for
Subscribers.
* You can add an `owner_group` field, as a ForeignKey to Group. Second is an `edit_groups` field, as a ManyToMany to
Group, and third is a `view_groups`, same as for edit.
Finally, when building a class based view, which is highly advised, you just have to inherit it from CanEditPropMixin,
CanEditMixin, or CanViewMixin, which are located in core.views. Your view will then be protected using either the
appropriate group fields, or the right method to check user permissions.
#### Counting the number of line of code
```bash
sudo apt install cloc
cloc --exclude-dir=doc,env .
```
#### Updating doc/SYNTAX.md
If you make an update in the Markdown syntax parser, it's good to document
update the syntax reference page in `doc/SYNTAX.md`. But updating this file will
break the tests if you don't update the corresponding `doc/SYNTAX.html` file at
the same time.
To do that, simply run `./manage.py markdown > doc/SYNTAX.html`,
and the tests should pass again.
+9
View File
@@ -0,0 +1,9 @@
# TODO
## Easter eggs
* 'A' 'L' 'L' 'O': Entendre le Allooo de Madame Coucoune
* idem avec cacafe
* Un meat spin quelque part
* Konami code
+23
View File
@@ -0,0 +1,23 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
+37
View File
@@ -0,0 +1,37 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from django.contrib import admin
from accounting.models import *
admin.site.register(BankAccount)
admin.site.register(ClubAccount)
admin.site.register(GeneralJournal)
admin.site.register(AccountingType)
admin.site.register(SimplifiedAccountingType)
admin.site.register(Operation)
admin.site.register(Label)
admin.site.register(Company)
+278
View File
@@ -0,0 +1,278 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
import django.core.validators
import accounting.models
class Migration(migrations.Migration):
dependencies = []
operations = [
migrations.CreateModel(
name="AccountingType",
fields=[
(
"id",
models.AutoField(
primary_key=True,
serialize=False,
verbose_name="ID",
auto_created=True,
),
),
(
"code",
models.CharField(
max_length=16,
verbose_name="code",
validators=[
django.core.validators.RegexValidator(
"^[0-9]*$",
"An accounting type code contains only numbers",
)
],
),
),
("label", models.CharField(max_length=128, verbose_name="label")),
(
"movement_type",
models.CharField(
choices=[
("CREDIT", "Credit"),
("DEBIT", "Debit"),
("NEUTRAL", "Neutral"),
],
max_length=12,
verbose_name="movement type",
),
),
],
options={
"verbose_name": "accounting type",
"ordering": ["movement_type", "code"],
},
),
migrations.CreateModel(
name="BankAccount",
fields=[
(
"id",
models.AutoField(
primary_key=True,
serialize=False,
verbose_name="ID",
auto_created=True,
),
),
("name", models.CharField(max_length=30, verbose_name="name")),
(
"iban",
models.CharField(max_length=255, blank=True, verbose_name="iban"),
),
(
"number",
models.CharField(
max_length=255, blank=True, verbose_name="account number"
),
),
],
options={"verbose_name": "Bank account", "ordering": ["club", "name"]},
),
migrations.CreateModel(
name="ClubAccount",
fields=[
(
"id",
models.AutoField(
primary_key=True,
serialize=False,
verbose_name="ID",
auto_created=True,
),
),
("name", models.CharField(max_length=30, verbose_name="name")),
],
options={
"verbose_name": "Club account",
"ordering": ["bank_account", "name"],
},
),
migrations.CreateModel(
name="Company",
fields=[
(
"id",
models.AutoField(
primary_key=True,
serialize=False,
verbose_name="ID",
auto_created=True,
),
),
("name", models.CharField(max_length=60, verbose_name="name")),
],
options={"verbose_name": "company"},
),
migrations.CreateModel(
name="GeneralJournal",
fields=[
(
"id",
models.AutoField(
primary_key=True,
serialize=False,
verbose_name="ID",
auto_created=True,
),
),
("start_date", models.DateField(verbose_name="start date")),
(
"end_date",
models.DateField(
null=True, verbose_name="end date", default=None, blank=True
),
),
("name", models.CharField(max_length=40, verbose_name="name")),
(
"closed",
models.BooleanField(verbose_name="is closed", default=False),
),
(
"amount",
accounting.models.CurrencyField(
decimal_places=2,
default=0,
verbose_name="amount",
max_digits=12,
),
),
(
"effective_amount",
accounting.models.CurrencyField(
decimal_places=2,
default=0,
verbose_name="effective_amount",
max_digits=12,
),
),
],
options={"verbose_name": "General journal", "ordering": ["-start_date"]},
),
migrations.CreateModel(
name="Operation",
fields=[
(
"id",
models.AutoField(
primary_key=True,
serialize=False,
verbose_name="ID",
auto_created=True,
),
),
("number", models.IntegerField(verbose_name="number")),
(
"amount",
accounting.models.CurrencyField(
decimal_places=2, max_digits=12, verbose_name="amount"
),
),
("date", models.DateField(verbose_name="date")),
("remark", models.CharField(max_length=128, verbose_name="comment")),
(
"mode",
models.CharField(
choices=[
("CHECK", "Check"),
("CASH", "Cash"),
("TRANSFERT", "Transfert"),
("CARD", "Credit card"),
],
max_length=255,
verbose_name="payment method",
),
),
(
"cheque_number",
models.CharField(
max_length=32,
null=True,
verbose_name="cheque number",
default="",
blank=True,
),
),
("done", models.BooleanField(verbose_name="is done", default=False)),
(
"target_type",
models.CharField(
choices=[
("USER", "User"),
("CLUB", "Club"),
("ACCOUNT", "Account"),
("COMPANY", "Company"),
("OTHER", "Other"),
],
max_length=10,
verbose_name="target type",
),
),
(
"target_id",
models.IntegerField(
null=True, verbose_name="target id", blank=True
),
),
(
"target_label",
models.CharField(
max_length=32,
blank=True,
verbose_name="target label",
default="",
),
),
(
"accounting_type",
models.ForeignKey(
null=True,
related_name="operations",
verbose_name="accounting type",
to="accounting.AccountingType",
blank=True,
),
),
],
options={"ordering": ["-number"]},
),
migrations.CreateModel(
name="SimplifiedAccountingType",
fields=[
(
"id",
models.AutoField(
primary_key=True,
serialize=False,
verbose_name="ID",
auto_created=True,
),
),
("label", models.CharField(max_length=128, verbose_name="label")),
(
"accounting_type",
models.ForeignKey(
verbose_name="simplified accounting types",
to="accounting.AccountingType",
related_name="simplified_types",
),
),
],
options={
"verbose_name": "simplified type",
"ordering": ["accounting_type__movement_type", "accounting_type__code"],
},
),
]
@@ -0,0 +1,94 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("club", "0001_initial"),
("accounting", "0001_initial"),
("core", "0001_initial"),
]
operations = [
migrations.AddField(
model_name="operation",
name="invoice",
field=models.ForeignKey(
null=True,
related_name="operations",
verbose_name="invoice",
to="core.SithFile",
blank=True,
),
),
migrations.AddField(
model_name="operation",
name="journal",
field=models.ForeignKey(
verbose_name="journal",
to="accounting.GeneralJournal",
related_name="operations",
),
),
migrations.AddField(
model_name="operation",
name="linked_operation",
field=models.OneToOneField(
blank=True,
to="accounting.Operation",
null=True,
related_name="operation_linked_to",
verbose_name="linked operation",
default=None,
),
),
migrations.AddField(
model_name="operation",
name="simpleaccounting_type",
field=models.ForeignKey(
null=True,
related_name="operations",
verbose_name="simple type",
to="accounting.SimplifiedAccountingType",
blank=True,
),
),
migrations.AddField(
model_name="generaljournal",
name="club_account",
field=models.ForeignKey(
verbose_name="club account",
to="accounting.ClubAccount",
related_name="journals",
),
),
migrations.AddField(
model_name="clubaccount",
name="bank_account",
field=models.ForeignKey(
verbose_name="bank account",
to="accounting.BankAccount",
related_name="club_accounts",
),
),
migrations.AddField(
model_name="clubaccount",
name="club",
field=models.ForeignKey(
verbose_name="club", to="club.Club", related_name="club_account"
),
),
migrations.AddField(
model_name="bankaccount",
name="club",
field=models.ForeignKey(
verbose_name="club", to="club.Club", related_name="bank_accounts"
),
),
migrations.AlterUniqueTogether(
name="operation", unique_together=set([("number", "journal")])
),
]
@@ -0,0 +1,50 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
import phonenumber_field.modelfields
class Migration(migrations.Migration):
dependencies = [("accounting", "0002_auto_20160824_2152")]
operations = [
migrations.AddField(
model_name="company",
name="city",
field=models.CharField(blank=True, verbose_name="city", max_length=60),
),
migrations.AddField(
model_name="company",
name="country",
field=models.CharField(blank=True, verbose_name="country", max_length=32),
),
migrations.AddField(
model_name="company",
name="email",
field=models.EmailField(blank=True, verbose_name="email", max_length=254),
),
migrations.AddField(
model_name="company",
name="phone",
field=phonenumber_field.modelfields.PhoneNumberField(
blank=True, verbose_name="phone", max_length=128
),
),
migrations.AddField(
model_name="company",
name="postcode",
field=models.CharField(blank=True, verbose_name="postcode", max_length=10),
),
migrations.AddField(
model_name="company",
name="street",
field=models.CharField(blank=True, verbose_name="street", max_length=60),
),
migrations.AddField(
model_name="company",
name="website",
field=models.CharField(blank=True, verbose_name="website", max_length=64),
),
]
@@ -0,0 +1,51 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [("accounting", "0003_auto_20160824_2203")]
operations = [
migrations.CreateModel(
name="Label",
fields=[
(
"id",
models.AutoField(
verbose_name="ID",
primary_key=True,
auto_created=True,
serialize=False,
),
),
("name", models.CharField(max_length=64, verbose_name="label")),
(
"club_account",
models.ForeignKey(
related_name="labels",
verbose_name="club account",
to="accounting.ClubAccount",
),
),
],
),
migrations.AddField(
model_name="operation",
name="label",
field=models.ForeignKey(
on_delete=django.db.models.deletion.SET_NULL,
related_name="operations",
null=True,
blank=True,
verbose_name="label",
to="accounting.Label",
),
),
migrations.AlterUniqueTogether(
name="label", unique_together=set([("name", "club_account")])
),
]
@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [("accounting", "0004_auto_20161005_1505")]
operations = [
migrations.AlterField(
model_name="operation",
name="remark",
field=models.CharField(
null=True, max_length=128, blank=True, verbose_name="comment"
),
)
]
+542
View File
@@ -0,0 +1,542 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from django.core.urlresolvers import reverse
from django.core.exceptions import ValidationError
from django.core import validators
from django.db import models
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
from django.template import defaultfilters
from phonenumber_field.modelfields import PhoneNumberField
from decimal import Decimal
from core.models import User, SithFile
from club.models import Club
class CurrencyField(models.DecimalField):
"""
This is a custom database field used for currency
"""
def __init__(self, *args, **kwargs):
kwargs["max_digits"] = 12
kwargs["decimal_places"] = 2
super(CurrencyField, self).__init__(*args, **kwargs)
def to_python(self, value):
try:
return super(CurrencyField, self).to_python(value).quantize(Decimal("0.01"))
except AttributeError:
return None
# Accounting classes
class Company(models.Model):
name = models.CharField(_("name"), max_length=60)
street = models.CharField(_("street"), max_length=60, blank=True)
city = models.CharField(_("city"), max_length=60, blank=True)
postcode = models.CharField(_("postcode"), max_length=10, blank=True)
country = models.CharField(_("country"), max_length=32, blank=True)
phone = PhoneNumberField(_("phone"), blank=True)
email = models.EmailField(_("email"), blank=True)
website = models.CharField(_("website"), max_length=64, blank=True)
class Meta:
verbose_name = _("company")
def is_owned_by(self, user):
"""
Method to see if that object can be edited by the given user
"""
if user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID):
return True
return False
def can_be_edited_by(self, user):
"""
Method to see if that object can be edited by the given user
"""
for club in user.memberships.filter(end_date=None).all():
if club and club.role == settings.SITH_CLUB_ROLES_ID["Treasurer"]:
return True
return False
def can_be_viewed_by(self, user):
"""
Method to see if that object can be viewed by the given user
"""
for club in user.memberships.filter(end_date=None).all():
if club and club.role >= settings.SITH_CLUB_ROLES_ID["Treasurer"]:
return True
return False
def get_absolute_url(self):
return reverse("accounting:co_edit", kwargs={"co_id": self.id})
def get_display_name(self):
return self.name
def __str__(self):
return self.name
class BankAccount(models.Model):
name = models.CharField(_("name"), max_length=30)
iban = models.CharField(_("iban"), max_length=255, blank=True)
number = models.CharField(_("account number"), max_length=255, blank=True)
club = models.ForeignKey(Club, related_name="bank_accounts", verbose_name=_("club"))
class Meta:
verbose_name = _("Bank account")
ordering = ["club", "name"]
def is_owned_by(self, user):
"""
Method to see if that object can be edited by the given user
"""
if user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID):
return True
m = self.club.get_membership_for(user)
if m is not None and m.role >= settings.SITH_CLUB_ROLES_ID["Treasurer"]:
return True
return False
def get_absolute_url(self):
return reverse("accounting:bank_details", kwargs={"b_account_id": self.id})
def __str__(self):
return self.name
class ClubAccount(models.Model):
name = models.CharField(_("name"), max_length=30)
club = models.ForeignKey(Club, related_name="club_account", verbose_name=_("club"))
bank_account = models.ForeignKey(
BankAccount, related_name="club_accounts", verbose_name=_("bank account")
)
class Meta:
verbose_name = _("Club account")
ordering = ["bank_account", "name"]
def is_owned_by(self, user):
"""
Method to see if that object can be edited by the given user
"""
if user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID):
return True
return False
def can_be_edited_by(self, user):
"""
Method to see if that object can be edited by the given user
"""
m = self.club.get_membership_for(user)
if m and m.role == settings.SITH_CLUB_ROLES_ID["Treasurer"]:
return True
return False
def can_be_viewed_by(self, user):
"""
Method to see if that object can be viewed by the given user
"""
m = self.club.get_membership_for(user)
if m and m.role >= settings.SITH_CLUB_ROLES_ID["Treasurer"]:
return True
return False
def has_open_journal(self):
for j in self.journals.all():
if not j.closed:
return True
return False
def get_open_journal(self):
return self.journals.filter(closed=False).first()
def get_absolute_url(self):
return reverse("accounting:club_details", kwargs={"c_account_id": self.id})
def __str__(self):
return self.name
def get_display_name(self):
return _("%(club_account)s on %(bank_account)s") % {
"club_account": self.name,
"bank_account": self.bank_account,
}
class GeneralJournal(models.Model):
"""
Class storing all the operations for a period of time
"""
start_date = models.DateField(_("start date"))
end_date = models.DateField(_("end date"), null=True, blank=True, default=None)
name = models.CharField(_("name"), max_length=40)
closed = models.BooleanField(_("is closed"), default=False)
club_account = models.ForeignKey(
ClubAccount, related_name="journals", null=False, verbose_name=_("club account")
)
amount = CurrencyField(_("amount"), default=0)
effective_amount = CurrencyField(_("effective_amount"), default=0)
class Meta:
verbose_name = _("General journal")
ordering = ["-start_date"]
def is_owned_by(self, user):
"""
Method to see if that object can be edited by the given user
"""
if user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID):
return True
if self.club_account.can_be_edited_by(user):
return True
return False
def can_be_edited_by(self, user):
"""
Method to see if that object can be edited by the given user
"""
if user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID):
return True
if self.club_account.can_be_edited_by(user):
return True
return False
def can_be_viewed_by(self, user):
return self.club_account.can_be_viewed_by(user)
def get_absolute_url(self):
return reverse("accounting:journal_details", kwargs={"j_id": self.id})
def __str__(self):
return self.name
def update_amounts(self):
self.amount = 0
self.effective_amount = 0
for o in self.operations.all():
if o.accounting_type.movement_type == "CREDIT":
if o.done:
self.effective_amount += o.amount
self.amount += o.amount
else:
if o.done:
self.effective_amount -= o.amount
self.amount -= o.amount
self.save()
class Operation(models.Model):
"""
An operation is a line in the journal, a debit or a credit
"""
number = models.IntegerField(_("number"))
journal = models.ForeignKey(
GeneralJournal, related_name="operations", null=False, verbose_name=_("journal")
)
amount = CurrencyField(_("amount"))
date = models.DateField(_("date"))
remark = models.CharField(_("comment"), max_length=128, null=True, blank=True)
mode = models.CharField(
_("payment method"),
max_length=255,
choices=settings.SITH_ACCOUNTING_PAYMENT_METHOD,
)
cheque_number = models.CharField(
_("cheque number"), max_length=32, default="", null=True, blank=True
)
invoice = models.ForeignKey(
SithFile,
related_name="operations",
verbose_name=_("invoice"),
null=True,
blank=True,
)
done = models.BooleanField(_("is done"), default=False)
simpleaccounting_type = models.ForeignKey(
"SimplifiedAccountingType",
related_name="operations",
verbose_name=_("simple type"),
null=True,
blank=True,
)
accounting_type = models.ForeignKey(
"AccountingType",
related_name="operations",
verbose_name=_("accounting type"),
null=True,
blank=True,
)
label = models.ForeignKey(
"Label",
related_name="operations",
verbose_name=_("label"),
null=True,
blank=True,
on_delete=models.SET_NULL,
)
target_type = models.CharField(
_("target type"),
max_length=10,
choices=[
("USER", _("User")),
("CLUB", _("Club")),
("ACCOUNT", _("Account")),
("COMPANY", _("Company")),
("OTHER", _("Other")),
],
)
target_id = models.IntegerField(_("target id"), null=True, blank=True)
target_label = models.CharField(
_("target label"), max_length=32, default="", blank=True
)
linked_operation = models.OneToOneField(
"self",
related_name="operation_linked_to",
verbose_name=_("linked operation"),
null=True,
blank=True,
default=None,
)
class Meta:
unique_together = ("number", "journal")
ordering = ["-number"]
def __getattribute__(self, attr):
if attr == "target":
return self.get_target()
else:
return object.__getattribute__(self, attr)
def clean(self):
super(Operation, self).clean()
if self.date is None:
raise ValidationError(_("The date must be set."))
elif self.date < self.journal.start_date:
raise ValidationError(
_(
"""The date can not be before the start date of the journal, which is
%(start_date)s."""
)
% {
"start_date": defaultfilters.date(
self.journal.start_date, settings.DATE_FORMAT
)
}
)
if self.target_type != "OTHER" and self.get_target() is None:
raise ValidationError(_("Target does not exists"))
if self.target_type == "OTHER" and self.target_label == "":
raise ValidationError(
_("Please add a target label if you set no existing target")
)
if not self.accounting_type and not self.simpleaccounting_type:
raise ValidationError(
_(
"You need to provide ether a simplified accounting type or a standard accounting type"
)
)
if self.simpleaccounting_type:
self.accounting_type = self.simpleaccounting_type.accounting_type
@property
def target(self):
return self.get_target()
def get_target(self):
tar = None
if self.target_type == "USER":
tar = User.objects.filter(id=self.target_id).first()
elif self.target_type == "CLUB":
tar = Club.objects.filter(id=self.target_id).first()
elif self.target_type == "ACCOUNT":
tar = ClubAccount.objects.filter(id=self.target_id).first()
elif self.target_type == "COMPANY":
tar = Company.objects.filter(id=self.target_id).first()
return tar
def save(self):
if self.number is None:
self.number = self.journal.operations.count() + 1
super(Operation, self).save()
self.journal.update_amounts()
def is_owned_by(self, user):
"""
Method to see if that object can be edited by the given user
"""
if user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID):
return True
if self.journal.closed:
return False
m = self.journal.club_account.club.get_membership_for(user)
if m is not None and m.role >= settings.SITH_CLUB_ROLES_ID["Treasurer"]:
return True
return False
def can_be_edited_by(self, user):
"""
Method to see if that object can be edited by the given user
"""
if user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID):
return True
if self.journal.closed:
return False
m = self.journal.club_account.club.get_membership_for(user)
if m is not None and m.role == settings.SITH_CLUB_ROLES_ID["Treasurer"]:
return True
return False
def get_absolute_url(self):
return reverse("accounting:journal_details", kwargs={"j_id": self.journal.id})
def __str__(self):
return "%d € | %s | %s | %s" % (
self.amount,
self.date,
self.accounting_type,
self.done,
)
class AccountingType(models.Model):
"""
Class describing the accounting types.
Thoses are numbers used in accounting to classify operations
"""
code = models.CharField(
_("code"),
max_length=16,
validators=[
validators.RegexValidator(
r"^[0-9]*$", _("An accounting type code contains only numbers")
)
],
)
label = models.CharField(_("label"), max_length=128)
movement_type = models.CharField(
_("movement type"),
choices=[
("CREDIT", _("Credit")),
("DEBIT", _("Debit")),
("NEUTRAL", _("Neutral")),
],
max_length=12,
)
class Meta:
verbose_name = _("accounting type")
ordering = ["movement_type", "code"]
def is_owned_by(self, user):
"""
Method to see if that object can be edited by the given user
"""
if user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID):
return True
return False
def get_absolute_url(self):
return reverse("accounting:type_list")
def __str__(self):
return self.code + " - " + self.get_movement_type_display() + " - " + self.label
class SimplifiedAccountingType(models.Model):
"""
Class describing the simplified accounting types.
"""
label = models.CharField(_("label"), max_length=128)
accounting_type = models.ForeignKey(
AccountingType,
related_name="simplified_types",
verbose_name=_("simplified accounting types"),
)
class Meta:
verbose_name = _("simplified type")
ordering = ["accounting_type__movement_type", "accounting_type__code"]
@property
def movement_type(self):
return self.accounting_type.movement_type
def get_movement_type_display(self):
return self.accounting_type.get_movement_type_display()
def get_absolute_url(self):
return reverse("accounting:simple_type_list")
def __str__(self):
return (
self.get_movement_type_display()
+ " - "
+ self.accounting_type.code
+ " - "
+ self.label
)
class Label(models.Model):
"""Label allow a club to sort its operations"""
name = models.CharField(_("label"), max_length=64)
club_account = models.ForeignKey(
ClubAccount, related_name="labels", verbose_name=_("club account")
)
class Meta:
unique_together = ("name", "club_account")
def __str__(self):
return "%s (%s)" % (self.name, self.club_account.name)
def get_absolute_url(self):
return reverse(
"accounting:label_list", kwargs={"clubaccount_id": self.club_account.id}
)
def is_owned_by(self, user):
return self.club_account.is_owned_by(user)
def can_be_edited_by(self, user):
return self.club_account.can_be_edited_by(user)
def can_be_viewed_by(self, user):
return self.club_account.can_be_viewed_by(user)
@@ -0,0 +1,27 @@
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}Accounting type list{% endtrans %}
{% endblock %}
{% block content %}
<div id="accounting">
<p>
<a href="{{ url('accounting:bank_list') }}">{% trans %}Accounting{% endtrans %}</a> >
{% trans %}Accounting types{% endtrans %}
</p>
<hr>
<p><a href="{{ url('accounting:type_new') }}">{% trans %}New accounting type{% endtrans %}</a></p>
{% if accountingtype_list %}
<h3>{% trans %}Accounting type list{% endtrans %}</h3>
<ul>
{% for a in accountingtype_list %}
<li><a href="{{ url('accounting:type_edit', type_id=a.id) }}">{{ a }}</a></li>
{% endfor %}
</ul>
{% else %}
{% trans %}There is no types in this website.{% endtrans %}
{% endif %}
</div>
{% endblock %}
@@ -0,0 +1,38 @@
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}Bank account: {% endtrans %}{{ object.name }}
{% endblock %}
{% block content %}
<div id="accounting">
<p>
<a href="{{ url('accounting:bank_list') }}">{% trans %}Accounting{% endtrans %}</a> >
{{ object.name }}
</p>
<hr>
<h2>{% trans %}Bank account: {% endtrans %}{{ object.name }}</h2>
{% if user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID) and not object.club_accounts.exists() %}
<a href="{{ url('accounting:bank_delete', b_account_id=object.id) }}">{% trans %}Delete{% endtrans %}</a>
{% endif %}
<h4>{% trans %}Infos{% endtrans %}</h4>
<ul>
<li><strong>{% trans %}IBAN: {% endtrans %}</strong>{{ object.iban }}</li>
<li><strong>{% trans %}Number: {% endtrans %}</strong>{{ object.number }}</li>
</ul>
<p><a href="{{ url('accounting:club_new') }}?parent={{ object.id }}">{% trans %}New club account{% endtrans %}</a></p>
<ul>
{% for c in object.club_accounts.all() %}
<li><a href="{{ url('accounting:club_details', c_account_id=c.id) }}">{{ c }}</a>
- <a href="{{ url('accounting:club_edit', c_account_id=c.id) }}">{% trans %}Edit{% endtrans %}</a>
{% if c.journals.count() == 0 %}
- <a href="{{ url('accounting:club_delete', c_account_id=c.id) }}">{% trans %}Delete{% endtrans %}</a>
{% endif %}
</li>
{% endfor %}
</ul>
</div>
{% endblock %}
@@ -0,0 +1,33 @@
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}Bank account list{% endtrans %}
{% endblock %}
{% block content %}
<div id="accounting">
<h4>
{% trans %}Accounting{% endtrans %}
</h4>
{% if user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID) %}
<p><a href="{{ url('accounting:simple_type_list') }}">{% trans %}Manage simplified types{% endtrans %}</a></p>
<p><a href="{{ url('accounting:type_list') }}">{% trans %}Manage accounting types{% endtrans %}</a></p>
<p><a href="{{ url('accounting:bank_new') }}">{% trans %}New bank account{% endtrans %}</a></p>
{% endif %}
{% if bankaccount_list %}
<h3>{% trans %}Bank account list{% endtrans %}</h3>
<ul>
{% for a in object_list %}
<li><a href="{{ url('accounting:bank_details', b_account_id=a.id) }}">{{ a }}</a>
- <a href="{{ url('accounting:bank_edit', b_account_id=a.id) }}">{% trans %}Edit{% endtrans %}</a>
</li>
{% endfor %}
</ul>
{% else %}
{% trans %}There is no accounts in this website.{% endtrans %}
{% endif %}
</div>
{% endblock %}
@@ -0,0 +1,68 @@
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}Club account:{% endtrans %} {{ object.name }}
{% endblock %}
{% block content %}
<div id="accounting">
<p>
<a href="{{ url('accounting:bank_list') }}">{% trans %}Accounting{% endtrans %}</a> >
<a href="{{ url('accounting:bank_details', b_account_id=object.bank_account.id) }}">{{object.bank_account }}</a> >
{{ object }}
</p>
<hr>
<h2>{% trans %}Club account:{% endtrans %} {{ object.name }}</h2>
{% if user.is_root and not object.journals.exists() %}
<a href="{{ url('accounting:club_delete', c_account_id=object.id) }}">{% trans %}Delete{% endtrans %}</a>
{% endif %}
{% if user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID) %}
<p><a href="{{ url('accounting:label_new') }}?parent={{ object.id }}">{% trans %}New label{% endtrans %}</a></p>
{% endif %}
<p><a href="{{ url('accounting:label_list', clubaccount_id=object.id) }}">{% trans %}Label list{% endtrans %}</a></p>
{% if not object.has_open_journal() %}
<p><a href="{{ url('accounting:journal_new') }}?parent={{ object.id }}">{% trans %}New journal{% endtrans %}</a></p>
{% else %}
<p>{% trans %}You can not create new journal while you still have one opened{% endtrans %}</p>
{% endif %}
<table>
<thead>
<tr>
<td>{% trans %}Name{% endtrans %}</td>
<td>{% trans %}Start{% endtrans %}</td>
<td>{% trans %}End{% endtrans %}</td>
<td>{% trans %}Amount{% endtrans %}</td>
<td>{% trans %}Effective amount{% endtrans %}</td>
<td>{% trans %}Closed{% endtrans %}</td>
<td>{% trans %}Actions{% endtrans %}</td>
</tr>
</thead>
<tbody>
{% for j in object.journals.all() %}
<tr>
<td>{{ j.name }}</td>
<td>{{ j.start_date }}</td>
{% if j.end_date %}
<td>{{ j.end_date }}</td>
{% else %}
<td> - </td>
{% endif %}
<td>{{ j.amount }} €</td>
<td>{{ j.effective_amount }} €</td>
{% if j.closed %}
<td>{% trans %}Yes{% endtrans %}</td>
{% else %}
<td>{% trans %}No{% endtrans %}</td>
{% endif %}
<td> <a href="{{ url('accounting:journal_details', j_id=j.id) }}">{% trans %}View{% endtrans %}</a>
<a href="{{ url('accounting:journal_edit', j_id=j.id) }}">{% trans %}Edit{% endtrans %}</a>
{% if user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID) and j.operations.count() == 0 %}
<a href="{{ url('accounting:journal_delete', j_id=j.id) }}">{% trans %}Delete{% endtrans %}</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}
@@ -0,0 +1,29 @@
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}Company list{% endtrans %}
{% endblock %}
{% block content %}
<div id="accounting">
{% if user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID) or user.is_root %}
<p><a href="{{ url('accounting:co_new') }}">{% trans %}Create new company{% endtrans %}</a></p>
{% endif %}
</br>
<table>
<thead>
<tr>
<td>{% trans %}Companies{% endtrans %}</td>
</tr>
</thead>
<tbody>
{% for o in object_list %}
<tr>
<td><a href="{{ url('accounting:co_edit', co_id=o.id) }}">{{ o.get_display_name() }}</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}
@@ -0,0 +1,100 @@
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}General journal:{% endtrans %} {{ object.name }}
{% endblock %}
{% block content %}
<div id="accounting">
<p>
<a href="{{ url('accounting:bank_list') }}">{% trans %}Accounting{% endtrans %}</a> >
<a href="{{ url('accounting:bank_details', b_account_id=object.club_account.bank_account.id) }}">{{object.club_account.bank_account }}</a> >
<a href="{{ url('accounting:club_details', c_account_id=object.club_account.id) }}">{{ object.club_account }}</a> >
{{ object.name }}
</p>
<hr>
<h2>{% trans %}General journal:{% endtrans %} {{ object.name }}</h2>
<p><a href="{{ url('accounting:label_new') }}?parent={{ object.club_account.id }}">{% trans %}New label{% endtrans %}</a></p>
<p><a href="{{ url('accounting:label_list', clubaccount_id=object.club_account.id) }}">{% trans %}Label list{% endtrans %}</a></p>
<p><a href="{{ url('accounting:co_list') }}">{% trans %}Company list{% endtrans %}</a></p>
<p><strong>{% trans %}Amount: {% endtrans %}</strong>{{ object.amount }} € -
<strong>{% trans %}Effective amount: {% endtrans %}</strong>{{ object.effective_amount }} €</p>
{% if object.closed %}
<p>{% trans %}Journal is closed, you can not create operation{% endtrans %}</p>
{% else %}
<p><a href="{{ url('accounting:op_new', j_id=object.id) }}">{% trans %}New operation{% endtrans %}</a></p>
</br>
{% endif %}
<div class="journal-table">
<table>
<thead>
<tr>
<td>{% trans %}Nb{% endtrans %}</td>
<td>{% trans %}Date{% endtrans %}</td>
<td>{% trans %}Label{% endtrans %}</td>
<td>{% trans %}Amount{% endtrans %}</td>
<td>{% trans %}Payment mode{% endtrans %}</td>
<td>{% trans %}Target{% endtrans %}</td>
<td>{% trans %}Code{% endtrans %}</td>
<td>{% trans %}Nature{% endtrans %}</td>
<td>{% trans %}Done{% endtrans %}</td>
<td>{% trans %}Comment{% endtrans %}</td>
<td>{% trans %}File{% endtrans %}</td>
<td>{% trans %}Actions{% endtrans %}</td>
<td>{% trans %}PDF{% endtrans %}</td>
</tr>
</thead>
<tbody>
{% for o in object.operations.all() %}
<tr>
<td>{{ o.number }}</td>
<td>{{ o.date }}</td>
<td>{{ o.label or "" }}</td>
{% if o.accounting_type.movement_type == "DEBIT" %}
<td class="neg-amount">&nbsp;{{ o.amount }}&nbsp;€</td>
{% else %}
<td class="pos-amount">&nbsp;{{ o.amount }}&nbsp;€</td>
{% endif %}
<td>{{ o.get_mode_display() }}</td>
{% if o.target_type == "OTHER" %}
<td>{{ o.target_label }}</td>
{% else %}
<td><a href="{{ o.target.get_absolute_url() }}">{{ o.target.get_display_name() }}</a></td>
{% endif %}
<td>{{ o.accounting_type.code }}</td>
<td>{{ o.accounting_type.label }}</td>
{% if o.done %}
<td>{% trans %}Yes{% endtrans %}</td>
{% else %}
<td>{% trans %}No{% endtrans %}</td>
{% endif %}
<td>{{ o.remark }}
{% if not o.linked_operation and o.target_type == "ACCOUNT" and not o.target.has_open_journal() %}
<p><strong>
{% trans %}Warning: this operation has no linked operation because the targeted club account has no opened journal.{% endtrans %}
</strong></p>
<p><strong>
{% trans url=o.target.get_absolute_url() %}Open a journal in <a href="{{ url }}">this club account</a>, then save this operation again to make the linked operation.{% endtrans %}
</strong></p>
{% endif %}
</td>
{% if o.invoice %}
<td><a href="{{ url('core:download', file_id=o.invoice.id) }}">{{ o.invoice.name }}</a></td>
{% else %}
<td>-</td>
{% endif %}
<td>
{% if o.journal.club_account.bank_account.name != "AE TI" and o.journal.club_account.bank_account.name != "TI" or user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID) %}
{% if not o.journal.closed %}
<a href="{{ url('accounting:op_edit', op_id=o.id) }}">{% trans %}Edit{% endtrans %}</a>
{% endif %}
{% endif %}
</td>
<td><a href="{{ url('accounting:op_pdf', op_id=o.id) }}">{% trans %}Generate{% endtrans %}</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endblock %}
@@ -0,0 +1,33 @@
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}General journal:{% endtrans %} {{ object.name }}
{% endblock %}
{% block content %}
<div id="accounting">
<h3>{% trans %}Accounting statement: {% endtrans %} {{ object.name }}</h3>
<table>
<thead>
<tr>
<td>{% trans %}Operation type{% endtrans %}</td>
<td>{% trans %}Sum{% endtrans %}</td>
</tr>
</thead>
<tbody>
{% for k,v in statement.items() %}
<tr>
<td>{{ k }}</td>
<td>{{ v }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<p><strong>{% trans %}Amount: {% endtrans %}</strong>{{ object.amount }} €</p>
<p><strong>{% trans %}Effective amount: {% endtrans %}</strong>{{ object.effective_amount }} €</p>
</div>
{% endblock %}
@@ -0,0 +1,57 @@
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}General journal:{% endtrans %} {{ object.name }}
{% endblock %}
{% macro display_tables(dict) %}
<div id="accounting">
<h6>{% trans %}Credit{% endtrans %}</h6>
<table>
<thead>
<tr>
<td>{% trans %}Nature of operation{% endtrans %}</td>
<td>{% trans %}Sum{% endtrans %}</td>
</tr>
</thead>
<tbody>
{% for k,v in dict['CREDIT'].items() %}
<tr>
<td>{{ k }}</td>
<td>{{ v }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% trans %}Total: {% endtrans %}{{ dict['CREDIT_sum'] }}
<h6>{% trans %}Debit{% endtrans %}</h6>
<table>
<thead>
<tr>
<td>{% trans %}Nature of operation{% endtrans %}</td>
<td>{% trans %}Sum{% endtrans %}</td>
</tr>
</thead>
<tbody>
{% for k,v in dict['DEBIT'].items() %}
<tr>
<td>{{ k }}</td>
<td>{{ v }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% trans %}Total: {% endtrans %}{{ dict['DEBIT_sum'] }}
{% endmacro %}
{% block content %}
<h3>{% trans %}Statement by nature: {% endtrans %} {{ object.name }}</h3>
{% for k,v in statement.items() %}
<h4 style="background: lightblue; padding: 4px;">{{ k }} : {{ v['CREDIT_sum'] - v['DEBIT_sum'] }}</h4>
{{ display_tables(v) }}
<hr>
{% endfor %}
</div>
{% endblock %}
@@ -0,0 +1,68 @@
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}General journal:{% endtrans %} {{ object.name }}
{% endblock %}
{% block content %}
<div id="accounting">
<h3>{% trans %}Statement by person: {% endtrans %} {{ object.name }}</h3>
<h4>{% trans %}Credit{% endtrans %}</h4>
<table>
<thead>
<tr>
<td>{% trans %}Target of the operation{% endtrans %}</td>
<td>{% trans %}Sum{% endtrans %}</td>
</tr>
</thead>
<tbody>
{% for key in credit_statement.keys() %}
<tr>
{% if key.target_type == "OTHER" %}
<td>{{ o.target_label }}</td>
{% elif key %}
<td><a href="{{ key.get_absolute_url() }}">{{ key.get_display_name() }}</a></td>
{% else %}
<td></td>
{% endif %}
<td>{{ credit_statement[key] }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<p>Total : {{ total_credit }}</p>
<h4>{% trans %}Debit{% endtrans %}</h4>
<table>
<thead>
<tr>
<td>{% trans %}Target of the operation{% endtrans %}</td>
<td>{% trans %}Sum{% endtrans %}</td>
</tr>
</thead>
<tbody>
{% for key in debit_statement.keys() %}
<tr>
{% if key.target_type == "OTHER" %}
<td>{{ o.target_label }}</td>
{% elif key %}
<td><a href="{{ key.get_absolute_url() }}">{{ key.get_display_name() }}</a></td>
{% else %}
<td></td>
{% endif %}
<td>{{ debit_statement[key] }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<p>Total : {{ total_debit }}</p>
</div>
{% endblock %}
@@ -0,0 +1,36 @@
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}Label list{% endtrans %}
{% endblock %}
{% block content %}
<div id="accounting">
<p>
<a href="{{ url('accounting:bank_list') }}">{% trans %}Accounting{% endtrans %}</a> >
<a href="{{ url('accounting:bank_details', b_account_id=object.bank_account.id) }}">{{object.bank_account }}</a> >
<a href="{{ url('accounting:club_details', c_account_id=object.id) }}">{{ object }}</a>
</p>
<hr>
<p><a href="{{ url('accounting:club_details', c_account_id=object.id) }}">{% trans %}Back to club account{% endtrans %}</a></p>
{% if user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID) %}
<p><a href="{{ url('accounting:label_new') }}?parent={{ object.id }}">{% trans %}New label{% endtrans %}</a></p>
{% endif %}
{% if object.labels.all() %}
<h3>{% trans %}Label list{% endtrans %}</h3>
<ul>
{% for l in object.labels.all() %}
<li><a href="{{ url('accounting:label_edit', label_id=l.id) }}">{{ l }}</a>
{% if user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID) %}
-
<a href="{{ url('accounting:label_delete', label_id=l.id) }}">{% trans %}Delete{% endtrans %}</a>
{% endif %}
</li>
{% endfor %}
</ul>
{% else %}
{% trans %}There is no label in this club account.{% endtrans %}
{% endif %}
</div>
{% endblock %}
@@ -0,0 +1,123 @@
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}Edit operation{% endtrans %}
{% endblock %}
{% block content %}
<div id="accounting">
<p>
<a href="{{ url('accounting:bank_list') }}">{% trans %}Accounting{% endtrans %}</a> >
<a href="{{ url('accounting:bank_details', b_account_id=object.club_account.bank_account.id) }}">{{object.club_account.bank_account }}</a> >
<a href="{{ url('accounting:club_details', c_account_id=object.club_account.id) }}">{{ object.club_account }}</a> >
<a href="{{ url('accounting:journal_details', j_id=object.id) }}">{{ object.name }}</a> >
{% trans %}Edit operation{% endtrans %}
</p>
<hr>
<h2>{% trans %}Edit operation{% endtrans %}</h2>
<form action="" method="post">
{% csrf_token %}
{{ form.non_field_errors() }}
{{ form.journal }}
{{ form.target_id }}
<p>{{ form.amount.errors }}<label for="{{ form.amount.name }}">{{ form.amount.label }}</label> {{ form.amount }}</p>
<p>{{ form.remark.errors }}<label for="{{ form.remark.name }}">{{ form.remark.label }}</label> {{ form.remark }}</p>
<br />
<strong>{% trans %}Warning: if you select <em>Account</em>, the opposite operation will be created in the target account. If you don't want that, select <em>Club</em> instead of <em>Account</em>.{% endtrans %}</strong>
<p>{{ form.target_type.errors }}<label for="{{ form.target_type.name }}">{{ form.target_type.label }}</label> {{ form.target_type }}</p>
{{ form.user }}
{{ form.club }}
{{ form.club_account }}
{{ form.company }}
{{ form.target_label }}
<span id="id_need_link_full"><label>{{ form.need_link.label }}</label> {{ form.need_link }}</span>
<p>{{ form.date.errors }}<label for="{{ form.date.name }}">{{ form.date.label }}</label> {{ form.date }}</p>
<p>{{ form.mode.errors }}<label for="{{ form.mode.name }}">{{ form.mode.label }}</label> {{ form.mode }}</p>
<p>{{ form.cheque_number.errors }}<label for="{{ form.cheque_number.name }}">{{ form.cheque_number.label }}</label> {{
form.cheque_number }}</p>
<p>{{ form.invoice.errors }}<label for="{{ form.invoice.name }}">{{ form.invoice.label }}</label> {{ form.invoice }}</p>
<p>{{ form.simpleaccounting_type.errors }}<label for="{{ form.simpleaccounting_type.name }}">{{
form.simpleaccounting_type.label }}</label> {{ form.simpleaccounting_type }}</p>
<p>{{ form.accounting_type.errors }}<label for="{{ form.accounting_type.name }}">{{ form.accounting_type.label }}</label> {{
form.accounting_type }}</p>
<p>{{ form.label.errors }}<label for="{{ form.label.name }}">{{ form.label.label }}</label> {{ form.label }}</p>
<p>{{ form.done.errors }}<label for="{{ form.done.name }}">{{ form.done.label }}</label> {{ form.done }}</p>
{% if form.instance.linked_operation %}
{% set obj = form.instance.linked_operation %}
<p><strong>{% trans %}Linked operation:{% endtrans %}</strong><br>
<a href="{{ url('accounting:bank_details', b_account_id=obj.journal.club_account.bank_account.id) }}">
{{obj.journal.club_account.bank_account }}</a> >
<a href="{{ url('accounting:club_details', c_account_id=obj.journal.club_account.id) }}">{{ obj.journal.club_account }}</a> >
<a href="{{ url('accounting:journal_details', j_id=obj.journal.id) }}">{{ obj.journal }}</a> >
n°{{ obj.number }}
</p>
{% endif %}
<p><input type="submit" value="{% trans %}Save{% endtrans %}" /></p>
</form>
{% endblock %}
{% block script %}
{{ super() }}
<script>
$( function() {
var target_type = $('#id_target_type');
var user = $('#id_user_wrapper');
var club = $('#id_club_wrapper');
var club_account = $('#id_club_account_wrapper');
var company = $('#id_company_wrapper');
var other = $('#id_target_label');
var need_link = $('#id_need_link_full');
function update_targets () {
if (target_type.val() == "USER") {
console.log(user);
user.show();
club.hide();
club_account.hide();
company.hide();
other.hide();
need_link.hide();
} else if (target_type.val() == "ACCOUNT") {
club_account.show();
need_link.show();
user.hide();
club.hide();
company.hide();
other.hide();
} else if (target_type.val() == "CLUB") {
club.show();
user.hide();
club_account.hide();
company.hide();
other.hide();
need_link.hide();
} else if (target_type.val() == "COMPANY") {
company.show();
user.hide();
club_account.hide();
club.hide();
other.hide();
need_link.hide();
} else if (target_type.val() == "OTHER") {
other.show();
user.hide();
club.hide();
club_account.hide();
company.hide();
need_link.hide();
} else {
company.hide();
user.hide();
club_account.hide();
club.hide();
other.hide();
need_link.hide();
}
}
update_targets();
target_type.change(update_targets);
} );
</script>
</div>
{% endblock %}
@@ -0,0 +1,16 @@
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}Refound account{% endtrans %}
{% endblock %}
{% block content %}
<div id="accounting">
<h3>{% trans %}Refound account{% endtrans %}</h3>
<form action="" method="post">
{% csrf_token %}
{{ form.as_p() }}
<p><input type="submit" value="{% trans %}Refound{% endtrans %}" /></p>
</form>
</div>
{% endblock %}
@@ -0,0 +1,27 @@
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}Simplified type list{% endtrans %}
{% endblock %}
{% block content %}
<div id="accounting">
<p>
<a href="{{ url('accounting:bank_list') }}">{% trans %}Accounting{% endtrans %}</a> >
{% trans %}Simplified types{% endtrans %}
</p>
<hr>
<p><a href="{{ url('accounting:simple_type_new') }}">{% trans %}New simplified type{% endtrans %}</a></p>
{% if simplifiedaccountingtype_list %}
<h3>{% trans %}Simplified type list{% endtrans %}</h3>
<ul>
{% for a in simplifiedaccountingtype_list %}
<li><a href="{{ url('accounting:simple_type_edit', type_id=a.id) }}">{{ a }}</a></li>
{% endfor %}
</ul>
{% else %}
{% trans %}There is no types in this website.{% endtrans %}
{% endif %}
</div>
{% endblock %}
+301
View File
@@ -0,0 +1,301 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from django.test import TestCase
from django.core.urlresolvers import reverse
from django.core.management import call_command
from datetime import date
from core.models import User
from accounting.models import (
GeneralJournal,
Operation,
Label,
AccountingType,
SimplifiedAccountingType,
)
class RefoundAccountTest(TestCase):
def setUp(self):
call_command("populate")
self.skia = User.objects.filter(username="skia").first()
# reffil skia's account
self.skia.customer.amount = 800
self.skia.customer.save()
def test_permission_denied(self):
self.client.login(username="guy", password="plop")
response_post = self.client.post(
reverse("accounting:refound_account"), {"user": self.skia.id}
)
response_get = self.client.get(reverse("accounting:refound_account"))
self.assertTrue(response_get.status_code == 403)
self.assertTrue(response_post.status_code == 403)
def test_root_granteed(self):
self.client.login(username="root", password="plop")
response_post = self.client.post(
reverse("accounting:refound_account"), {"user": self.skia.id}
)
self.skia = User.objects.filter(username="skia").first()
response_get = self.client.get(reverse("accounting:refound_account"))
self.assertFalse(response_get.status_code == 403)
self.assertTrue('<form action="" method="post">' in str(response_get.content))
self.assertFalse(response_post.status_code == 403)
self.assertTrue(self.skia.customer.amount == 0)
def test_comptable_granteed(self):
self.client.login(username="comptable", password="plop")
response_post = self.client.post(
reverse("accounting:refound_account"), {"user": self.skia.id}
)
self.skia = User.objects.filter(username="skia").first()
response_get = self.client.get(reverse("accounting:refound_account"))
self.assertFalse(response_get.status_code == 403)
self.assertTrue('<form action="" method="post">' in str(response_get.content))
self.assertFalse(response_post.status_code == 403)
self.assertTrue(self.skia.customer.amount == 0)
class JournalTest(TestCase):
def setUp(self):
call_command("populate")
self.journal = GeneralJournal.objects.filter(id=1).first()
def test_permission_granted(self):
self.client.login(username="comptable", password="plop")
response_get = self.client.get(
reverse("accounting:journal_details", args=[self.journal.id])
)
self.assertTrue(response_get.status_code == 200)
self.assertTrue(
"<td>M\\xc3\\xa9thode de paiement</td>" in str(response_get.content)
)
def test_permission_not_granted(self):
self.client.login(username="skia", password="plop")
response_get = self.client.get(
reverse("accounting:journal_details", args=[self.journal.id])
)
self.assertTrue(response_get.status_code == 403)
self.assertFalse(
"<td>M\xc3\xa9thode de paiement</td>" in str(response_get.content)
)
class OperationTest(TestCase):
def setUp(self):
call_command("populate")
self.journal = GeneralJournal.objects.filter(id=1).first()
self.skia = User.objects.filter(username="skia").first()
at = AccountingType(
code="443", label="Ce code n'existe pas", movement_type="CREDIT"
)
at.save()
l = Label(club_account=self.journal.club_account, name="bob")
l.save()
self.client.login(username="comptable", password="plop")
self.op1 = Operation(
journal=self.journal,
date=date.today(),
amount=1,
remark="Test bilan",
mode="CASH",
done=True,
label=l,
accounting_type=at,
target_type="USER",
target_id=self.skia.id,
)
self.op1.save()
self.op2 = Operation(
journal=self.journal,
date=date.today(),
amount=2,
remark="Test bilan",
mode="CASH",
done=True,
label=l,
accounting_type=at,
target_type="USER",
target_id=self.skia.id,
)
self.op2.save()
def test_new_operation(self):
self.client.login(username="comptable", password="plop")
at = AccountingType.objects.filter(code="604").first()
response = self.client.post(
reverse("accounting:op_new", args=[self.journal.id]),
{
"amount": 30,
"remark": "Un gros test",
"journal": self.journal.id,
"target_type": "OTHER",
"target_id": "",
"target_label": "Le fantome de la nuit",
"date": "04/12/2020",
"mode": "CASH",
"cheque_number": "",
"invoice": "",
"simpleaccounting_type": "",
"accounting_type": at.id,
"label": "",
"done": False,
},
)
self.assertFalse(response.status_code == 403)
self.assertTrue(
self.journal.operations.filter(
target_label="Le fantome de la nuit"
).exists()
)
response_get = self.client.get(
reverse("accounting:journal_details", args=[self.journal.id])
)
self.assertTrue("<td>Le fantome de la nuit</td>" in str(response_get.content))
def test_bad_new_operation(self):
self.client.login(username="comptable", password="plop")
AccountingType.objects.filter(code="604").first()
response = self.client.post(
reverse("accounting:op_new", args=[self.journal.id]),
{
"amount": 30,
"remark": "Un gros test",
"journal": self.journal.id,
"target_type": "OTHER",
"target_id": "",
"target_label": "Le fantome de la nuit",
"date": "04/12/2020",
"mode": "CASH",
"cheque_number": "",
"invoice": "",
"simpleaccounting_type": "",
"accounting_type": "",
"label": "",
"done": False,
},
)
self.assertTrue(
"Vous devez fournir soit un type comptable simplifi\\xc3\\xa9 ou un type comptable standard"
in str(response.content)
)
def test_new_operation_not_authorized(self):
self.client.login(username="skia", password="plop")
at = AccountingType.objects.filter(code="604").first()
response = self.client.post(
reverse("accounting:op_new", args=[self.journal.id]),
{
"amount": 30,
"remark": "Un gros test",
"journal": self.journal.id,
"target_type": "OTHER",
"target_id": "",
"target_label": "Le fantome du jour",
"date": "04/12/2020",
"mode": "CASH",
"cheque_number": "",
"invoice": "",
"simpleaccounting_type": "",
"accounting_type": at.id,
"label": "",
"done": False,
},
)
self.assertTrue(response.status_code == 403)
self.assertFalse(
self.journal.operations.filter(target_label="Le fantome du jour").exists()
)
def test__operation_simple_accounting(self):
self.client.login(username="comptable", password="plop")
sat = SimplifiedAccountingType.objects.all().first()
response = self.client.post(
reverse("accounting:op_new", args=[self.journal.id]),
{
"amount": 23,
"remark": "Un gros test",
"journal": self.journal.id,
"target_type": "OTHER",
"target_id": "",
"target_label": "Le fantome de l'aurore",
"date": "04/12/2020",
"mode": "CASH",
"cheque_number": "",
"invoice": "",
"simpleaccounting_type": sat.id,
"accounting_type": "",
"label": "",
"done": False,
},
)
self.assertFalse(response.status_code == 403)
self.assertTrue(self.journal.operations.filter(amount=23).exists())
response_get = self.client.get(
reverse("accounting:journal_details", args=[self.journal.id])
)
self.assertTrue(
"<td>Le fantome de l&#39;aurore</td>" in str(response_get.content)
)
self.assertTrue(
self.journal.operations.filter(amount=23)
.values("accounting_type")
.first()["accounting_type"]
== AccountingType.objects.filter(code=6).values("id").first()["id"]
)
def test_nature_statement(self):
self.client.login(username="comptable", password="plop")
response_get = self.client.get(
reverse("accounting:journal_nature_statement", args=[self.journal.id])
)
self.assertTrue(
"bob (Troll Pench\\xc3\\xa9) : 3.00" in str(response_get.content)
)
def test_person_statement(self):
self.client.login(username="comptable", password="plop")
response_get = self.client.get(
reverse("accounting:journal_person_statement", args=[self.journal.id])
)
self.assertTrue(
"<td>3.00</td>" in str(response_get.content)
and '<td><a href="/user/1/">S&#39; Kia</a></td>'
in str(response_get.content)
)
def test_accounting_statement(self):
self.client.login(username="comptable", password="plop")
response_get = self.client.get(
reverse("accounting:journal_accounting_statement", args=[self.journal.id])
)
self.assertTrue(
"<td>443 - Cr\\xc3\\xa9dit - Ce code n&#39;existe pas</td>"
in str(response_get.content)
)
+152
View File
@@ -0,0 +1,152 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from django.conf.urls import url
from accounting.views import *
urlpatterns = [
# Accounting types
url(
r"^simple_type$",
SimplifiedAccountingTypeListView.as_view(),
name="simple_type_list",
),
url(
r"^simple_type/create$",
SimplifiedAccountingTypeCreateView.as_view(),
name="simple_type_new",
),
url(
r"^simple_type/(?P<type_id>[0-9]+)/edit$",
SimplifiedAccountingTypeEditView.as_view(),
name="simple_type_edit",
),
# Accounting types
url(r"^type$", AccountingTypeListView.as_view(), name="type_list"),
url(r"^type/create$", AccountingTypeCreateView.as_view(), name="type_new"),
url(
r"^type/(?P<type_id>[0-9]+)/edit$",
AccountingTypeEditView.as_view(),
name="type_edit",
),
# Bank accounts
url(r"^$", BankAccountListView.as_view(), name="bank_list"),
url(r"^bank/create$", BankAccountCreateView.as_view(), name="bank_new"),
url(
r"^bank/(?P<b_account_id>[0-9]+)$",
BankAccountDetailView.as_view(),
name="bank_details",
),
url(
r"^bank/(?P<b_account_id>[0-9]+)/edit$",
BankAccountEditView.as_view(),
name="bank_edit",
),
url(
r"^bank/(?P<b_account_id>[0-9]+)/delete$",
BankAccountDeleteView.as_view(),
name="bank_delete",
),
# Club accounts
url(r"^club/create$", ClubAccountCreateView.as_view(), name="club_new"),
url(
r"^club/(?P<c_account_id>[0-9]+)$",
ClubAccountDetailView.as_view(),
name="club_details",
),
url(
r"^club/(?P<c_account_id>[0-9]+)/edit$",
ClubAccountEditView.as_view(),
name="club_edit",
),
url(
r"^club/(?P<c_account_id>[0-9]+)/delete$",
ClubAccountDeleteView.as_view(),
name="club_delete",
),
# Journals
url(r"^journal/create$", JournalCreateView.as_view(), name="journal_new"),
url(
r"^journal/(?P<j_id>[0-9]+)$",
JournalDetailView.as_view(),
name="journal_details",
),
url(
r"^journal/(?P<j_id>[0-9]+)/edit$",
JournalEditView.as_view(),
name="journal_edit",
),
url(
r"^journal/(?P<j_id>[0-9]+)/delete$",
JournalDeleteView.as_view(),
name="journal_delete",
),
url(
r"^journal/(?P<j_id>[0-9]+)/statement/nature$",
JournalNatureStatementView.as_view(),
name="journal_nature_statement",
),
url(
r"^journal/(?P<j_id>[0-9]+)/statement/person$",
JournalPersonStatementView.as_view(),
name="journal_person_statement",
),
url(
r"^journal/(?P<j_id>[0-9]+)/statement/accounting$",
JournalAccountingStatementView.as_view(),
name="journal_accounting_statement",
),
# Operations
url(
r"^operation/create/(?P<j_id>[0-9]+)$",
OperationCreateView.as_view(),
name="op_new",
),
url(r"^operation/(?P<op_id>[0-9]+)$", OperationEditView.as_view(), name="op_edit"),
url(
r"^operation/(?P<op_id>[0-9]+)/pdf$", OperationPDFView.as_view(), name="op_pdf"
),
# Companies
url(r"^company/list$", CompanyListView.as_view(), name="co_list"),
url(r"^company/create$", CompanyCreateView.as_view(), name="co_new"),
url(r"^company/(?P<co_id>[0-9]+)$", CompanyEditView.as_view(), name="co_edit"),
# Labels
url(r"^label/new$", LabelCreateView.as_view(), name="label_new"),
url(
r"^label/(?P<clubaccount_id>[0-9]+)$",
LabelListView.as_view(),
name="label_list",
),
url(
r"^label/(?P<label_id>[0-9]+)/edit$", LabelEditView.as_view(), name="label_edit"
),
url(
r"^label/(?P<label_id>[0-9]+)/delete$",
LabelDeleteView.as_view(),
name="label_delete",
),
# User account
url(r"^refound/account$", RefoundAccountView.as_view(), name="refound_account"),
]
+942
View File
@@ -0,0 +1,942 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from django.views.generic import ListView, DetailView
from django.views.generic.edit import UpdateView, CreateView, DeleteView, FormView
from django.core.urlresolvers import reverse_lazy, reverse
from django.utils.translation import ugettext_lazy as _
from django.forms.models import modelform_factory
from django.core.exceptions import PermissionDenied, ValidationError
from django.forms import HiddenInput
from django.db import transaction
from django.db.models import Sum
from django.conf import settings
from django import forms
from django.http import HttpResponse
import collections
from ajax_select.fields import AutoCompleteSelectField
from core.views import (
CanViewMixin,
CanEditMixin,
CanEditPropMixin,
CanCreateMixin,
TabedViewMixin,
)
from core.views.forms import SelectFile, SelectDate
from accounting.models import (
BankAccount,
ClubAccount,
GeneralJournal,
Operation,
AccountingType,
Company,
SimplifiedAccountingType,
Label,
)
from counter.models import Counter, Selling, Product
# Main accounting view
class BankAccountListView(CanViewMixin, ListView):
"""
A list view for the admins
"""
model = BankAccount
template_name = "accounting/bank_account_list.jinja"
ordering = ["name"]
# Simplified accounting types
class SimplifiedAccountingTypeListView(CanViewMixin, ListView):
"""
A list view for the admins
"""
model = SimplifiedAccountingType
template_name = "accounting/simplifiedaccountingtype_list.jinja"
class SimplifiedAccountingTypeEditView(CanViewMixin, UpdateView):
"""
An edit view for the admins
"""
model = SimplifiedAccountingType
pk_url_kwarg = "type_id"
fields = ["label", "accounting_type"]
template_name = "core/edit.jinja"
class SimplifiedAccountingTypeCreateView(CanCreateMixin, CreateView):
"""
Create an accounting type (for the admins)
"""
model = SimplifiedAccountingType
fields = ["label", "accounting_type"]
template_name = "core/create.jinja"
# Accounting types
class AccountingTypeListView(CanViewMixin, ListView):
"""
A list view for the admins
"""
model = AccountingType
template_name = "accounting/accountingtype_list.jinja"
class AccountingTypeEditView(CanViewMixin, UpdateView):
"""
An edit view for the admins
"""
model = AccountingType
pk_url_kwarg = "type_id"
fields = ["code", "label", "movement_type"]
template_name = "core/edit.jinja"
class AccountingTypeCreateView(CanCreateMixin, CreateView):
"""
Create an accounting type (for the admins)
"""
model = AccountingType
fields = ["code", "label", "movement_type"]
template_name = "core/create.jinja"
# BankAccount views
class BankAccountEditView(CanViewMixin, UpdateView):
"""
An edit view for the admins
"""
model = BankAccount
pk_url_kwarg = "b_account_id"
fields = ["name", "iban", "number", "club"]
template_name = "core/edit.jinja"
class BankAccountDetailView(CanViewMixin, DetailView):
"""
A detail view, listing every club account
"""
model = BankAccount
pk_url_kwarg = "b_account_id"
template_name = "accounting/bank_account_details.jinja"
class BankAccountCreateView(CanCreateMixin, CreateView):
"""
Create a bank account (for the admins)
"""
model = BankAccount
fields = ["name", "club", "iban", "number"]
template_name = "core/create.jinja"
class BankAccountDeleteView(
CanEditPropMixin, DeleteView
): # TODO change Delete to Close
"""
Delete a bank account (for the admins)
"""
model = BankAccount
pk_url_kwarg = "b_account_id"
template_name = "core/delete_confirm.jinja"
success_url = reverse_lazy("accounting:bank_list")
# ClubAccount views
class ClubAccountEditView(CanViewMixin, UpdateView):
"""
An edit view for the admins
"""
model = ClubAccount
pk_url_kwarg = "c_account_id"
fields = ["name", "club", "bank_account"]
template_name = "core/edit.jinja"
class ClubAccountDetailView(CanViewMixin, DetailView):
"""
A detail view, listing every journal
"""
model = ClubAccount
pk_url_kwarg = "c_account_id"
template_name = "accounting/club_account_details.jinja"
class ClubAccountCreateView(CanCreateMixin, CreateView):
"""
Create a club account (for the admins)
"""
model = ClubAccount
fields = ["name", "club", "bank_account"]
template_name = "core/create.jinja"
def get_initial(self):
ret = super(ClubAccountCreateView, self).get_initial()
if "parent" in self.request.GET.keys():
obj = BankAccount.objects.filter(id=int(self.request.GET["parent"])).first()
if obj is not None:
ret["bank_account"] = obj.id
return ret
class ClubAccountDeleteView(
CanEditPropMixin, DeleteView
): # TODO change Delete to Close
"""
Delete a club account (for the admins)
"""
model = ClubAccount
pk_url_kwarg = "c_account_id"
template_name = "core/delete_confirm.jinja"
success_url = reverse_lazy("accounting:bank_list")
# Journal views
class JournalTabsMixin(TabedViewMixin):
def get_tabs_title(self):
return _("Journal")
def get_list_of_tabs(self):
tab_list = []
tab_list.append(
{
"url": reverse(
"accounting:journal_details", kwargs={"j_id": self.object.id}
),
"slug": "journal",
"name": _("Journal"),
}
)
tab_list.append(
{
"url": reverse(
"accounting:journal_nature_statement",
kwargs={"j_id": self.object.id},
),
"slug": "nature_statement",
"name": _("Statement by nature"),
}
)
tab_list.append(
{
"url": reverse(
"accounting:journal_person_statement",
kwargs={"j_id": self.object.id},
),
"slug": "person_statement",
"name": _("Statement by person"),
}
)
tab_list.append(
{
"url": reverse(
"accounting:journal_accounting_statement",
kwargs={"j_id": self.object.id},
),
"slug": "accounting_statement",
"name": _("Accounting statement"),
}
)
return tab_list
class JournalCreateView(CanCreateMixin, CreateView):
"""
Create a general journal
"""
model = GeneralJournal
form_class = modelform_factory(
GeneralJournal,
fields=["name", "start_date", "club_account"],
widgets={"start_date": SelectDate},
)
template_name = "core/create.jinja"
def get_initial(self):
ret = super(JournalCreateView, self).get_initial()
if "parent" in self.request.GET.keys():
obj = ClubAccount.objects.filter(id=int(self.request.GET["parent"])).first()
if obj is not None:
ret["club_account"] = obj.id
return ret
class JournalDetailView(JournalTabsMixin, CanViewMixin, DetailView):
"""
A detail view, listing every operation
"""
model = GeneralJournal
pk_url_kwarg = "j_id"
template_name = "accounting/journal_details.jinja"
current_tab = "journal"
class JournalEditView(CanEditMixin, UpdateView):
"""
Update a general journal
"""
model = GeneralJournal
pk_url_kwarg = "j_id"
fields = ["name", "start_date", "end_date", "club_account", "closed"]
template_name = "core/edit.jinja"
class JournalDeleteView(CanEditPropMixin, DeleteView):
"""
Delete a club account (for the admins)
"""
model = GeneralJournal
pk_url_kwarg = "j_id"
template_name = "core/delete_confirm.jinja"
success_url = reverse_lazy("accounting:club_details")
def dispatch(self, request, *args, **kwargs):
self.object = self.get_object()
if self.object.operations.count() == 0:
return super(JournalDeleteView, self).dispatch(request, *args, **kwargs)
else:
raise PermissionDenied
# Operation views
class OperationForm(forms.ModelForm):
class Meta:
model = Operation
fields = [
"amount",
"remark",
"journal",
"target_type",
"target_id",
"target_label",
"date",
"mode",
"cheque_number",
"invoice",
"simpleaccounting_type",
"accounting_type",
"label",
"done",
]
widgets = {
"journal": HiddenInput,
"target_id": HiddenInput,
"date": SelectDate,
"invoice": SelectFile,
}
user = AutoCompleteSelectField("users", help_text=None, required=False)
club_account = AutoCompleteSelectField(
"club_accounts", help_text=None, required=False
)
club = AutoCompleteSelectField("clubs", help_text=None, required=False)
company = AutoCompleteSelectField("companies", help_text=None, required=False)
need_link = forms.BooleanField(
label=_("Link this operation to the target account"),
required=False,
initial=False,
)
def __init__(self, *args, **kwargs):
club_account = kwargs.pop("club_account", None)
super(OperationForm, self).__init__(*args, **kwargs)
if club_account:
self.fields["label"].queryset = club_account.labels.order_by("name").all()
if self.instance.target_type == "USER":
self.fields["user"].initial = self.instance.target_id
elif self.instance.target_type == "ACCOUNT":
self.fields["club_account"].initial = self.instance.target_id
elif self.instance.target_type == "CLUB":
self.fields["club"].initial = self.instance.target_id
elif self.instance.target_type == "COMPANY":
self.fields["company"].initial = self.instance.target_id
def clean(self):
self.cleaned_data = super(OperationForm, self).clean()
if "target_type" in self.cleaned_data.keys():
if (
self.cleaned_data.get("user") is None
and self.cleaned_data.get("club") is None
and self.cleaned_data.get("club_account") is None
and self.cleaned_data.get("company") is None
and self.cleaned_data.get("target_label") == ""
):
self.add_error(
"target_type", ValidationError(_("The target must be set."))
)
else:
if self.cleaned_data["target_type"] == "USER":
self.cleaned_data["target_id"] = self.cleaned_data["user"].id
elif self.cleaned_data["target_type"] == "ACCOUNT":
self.cleaned_data["target_id"] = self.cleaned_data[
"club_account"
].id
elif self.cleaned_data["target_type"] == "CLUB":
self.cleaned_data["target_id"] = self.cleaned_data["club"].id
elif self.cleaned_data["target_type"] == "COMPANY":
self.cleaned_data["target_id"] = self.cleaned_data["company"].id
if self.cleaned_data.get("amount") is None:
self.add_error("amount", ValidationError(_("The amount must be set.")))
return self.cleaned_data
def save(self):
ret = super(OperationForm, self).save()
if (
self.instance.target_type == "ACCOUNT"
and not self.instance.linked_operation
and self.instance.target.has_open_journal()
and self.cleaned_data["need_link"]
):
inst = self.instance
club_account = inst.target
acc_type = (
AccountingType.objects.exclude(movement_type="NEUTRAL")
.exclude(movement_type=inst.accounting_type.movement_type)
.order_by("code")
.first()
) # Select a random opposite accounting type
op = Operation(
journal=club_account.get_open_journal(),
amount=inst.amount,
date=inst.date,
remark=inst.remark,
mode=inst.mode,
cheque_number=inst.cheque_number,
invoice=inst.invoice,
done=False, # Has to be checked by hand
simpleaccounting_type=None,
accounting_type=acc_type,
target_type="ACCOUNT",
target_id=inst.journal.club_account.id,
target_label="",
linked_operation=inst,
)
op.save()
self.instance.linked_operation = op
self.save()
return ret
class OperationCreateView(CanCreateMixin, CreateView):
"""
Create an operation
"""
model = Operation
form_class = OperationForm
template_name = "accounting/operation_edit.jinja"
def get_form(self, form_class=None):
self.journal = GeneralJournal.objects.filter(id=self.kwargs["j_id"]).first()
ca = self.journal.club_account if self.journal else None
return self.form_class(club_account=ca, **self.get_form_kwargs())
def get_initial(self):
ret = super(OperationCreateView, self).get_initial()
if self.journal is not None:
ret["journal"] = self.journal.id
return ret
def get_context_data(self, **kwargs):
""" Add journal to the context """
kwargs = super(OperationCreateView, self).get_context_data(**kwargs)
if self.journal:
kwargs["object"] = self.journal
return kwargs
class OperationEditView(CanEditMixin, UpdateView):
"""
An edit view, working as detail for the moment
"""
model = Operation
pk_url_kwarg = "op_id"
form_class = OperationForm
template_name = "accounting/operation_edit.jinja"
def get_context_data(self, **kwargs):
""" Add journal to the context """
kwargs = super(OperationEditView, self).get_context_data(**kwargs)
kwargs["object"] = self.object.journal
return kwargs
class OperationPDFView(CanViewMixin, DetailView):
"""
Display the PDF of a given operation
"""
model = Operation
pk_url_kwarg = "op_id"
def get(self, request, *args, **kwargs):
from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
from reportlab.platypus import Table, TableStyle
from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.lib.utils import ImageReader
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
pdfmetrics.registerFont(TTFont("DejaVu", "DejaVuSerif.ttf"))
self.object = self.get_object()
amount = self.object.amount
remark = self.object.remark
nature = self.object.accounting_type.movement_type
num = self.object.number
date = self.object.date
mode = self.object.mode
club_name = self.object.journal.club_account.name
ti = self.object.journal.name
op_label = self.object.label
club_address = self.object.journal.club_account.club.address
id_op = self.object.id
if self.object.target_type == "OTHER":
target = self.object.target_label
else:
target = self.object.target.get_display_name()
response = HttpResponse(content_type="application/pdf")
response["Content-Disposition"] = 'filename="op-%d(%s_on_%s).pdf"' % (
num,
ti,
club_name,
)
p = canvas.Canvas(response)
p.setFont("DejaVu", 12)
p.setTitle("%s %d" % (_("Operation"), num))
width, height = letter
im = ImageReader("core/static/core/img/logo.jpg")
iw, ih = im.getSize()
p.drawImage(im, 40, height - 50, width=iw / 2, height=ih / 2)
labelStr = [["%s %s - %s %s" % (_("Journal"), ti, _("Operation"), num)]]
label = Table(labelStr, colWidths=[150], rowHeights=[20])
label.setStyle(TableStyle([("ALIGN", (0, 0), (-1, -1), "RIGHT")]))
w, h = label.wrapOn(label, 0, 0)
label.drawOn(p, width - 180, height)
p.drawString(
90, height - 100, _("Financial proof: ") + "OP%010d" % (id_op)
) # Justificatif du libellé
p.drawString(
90, height - 130, _("Club: %(club_name)s") % ({"club_name": club_name})
)
p.drawString(
90,
height - 160,
_("Label: %(op_label)s")
% {"op_label": op_label if op_label is not None else ""},
)
p.drawString(90, height - 190, _("Date: %(date)s") % {"date": date})
data = []
data += [
["%s" % (_("Credit").upper() if nature == "CREDIT" else _("Debit").upper())]
]
data += [[_("Amount: %(amount).2f") % {"amount": amount}]]
payment_mode = ""
for m in settings.SITH_ACCOUNTING_PAYMENT_METHOD:
if m[0] == mode:
payment_mode += "[\u00D7]"
else:
payment_mode += "[ ]"
payment_mode += " %s\n" % (m[1])
data += [[payment_mode]]
data += [
[
"%s : %s"
% (_("Debtor") if nature == "CREDIT" else _("Creditor"), target),
"",
]
]
data += [["%s \n%s" % (_("Comment:"), remark)]]
t = Table(
data, colWidths=[(width - 90 * 2) / 2] * 2, rowHeights=[20, 20, 70, 20, 80]
)
t.setStyle(
TableStyle(
[
("ALIGN", (0, 0), (-1, -1), "CENTER"),
("VALIGN", (-2, -1), (-1, -1), "TOP"),
("VALIGN", (0, 0), (-1, -2), "MIDDLE"),
("INNERGRID", (0, 0), (-1, -1), 0.25, colors.black),
("SPAN", (0, 0), (1, 0)), # line DEBIT/CREDIT
("SPAN", (0, 1), (1, 1)), # line amount
("SPAN", (-2, -1), (-1, -1)), # line comment
("SPAN", (0, -2), (-1, -2)), # line creditor/debtor
("SPAN", (0, 2), (1, 2)), # line payment_mode
("ALIGN", (0, 2), (1, 2), "LEFT"), # line payment_mode
("ALIGN", (-2, -1), (-1, -1), "LEFT"),
("BOX", (0, 0), (-1, -1), 0.25, colors.black),
]
)
)
signature = []
signature += [[_("Signature:")]]
tSig = Table(signature, colWidths=[(width - 90 * 2)], rowHeights=[80])
tSig.setStyle(
TableStyle(
[
("VALIGN", (0, 0), (-1, -1), "TOP"),
("BOX", (0, 0), (-1, -1), 0.25, colors.black),
]
)
)
w, h = tSig.wrapOn(p, 0, 0)
tSig.drawOn(p, 90, 200)
w, h = t.wrapOn(p, 0, 0)
t.drawOn(p, 90, 350)
p.drawCentredString(10.5 * cm, 2 * cm, club_name)
p.drawCentredString(10.5 * cm, 1 * cm, club_address)
p.showPage()
p.save()
return response
class JournalNatureStatementView(JournalTabsMixin, CanViewMixin, DetailView):
"""
Display a statement sorted by labels
"""
model = GeneralJournal
pk_url_kwarg = "j_id"
template_name = "accounting/journal_statement_nature.jinja"
current_tab = "nature_statement"
def statement(self, queryset, movement_type):
ret = collections.OrderedDict()
statement = collections.OrderedDict()
total_sum = 0
for sat in [None] + list(
SimplifiedAccountingType.objects.order_by("label").all()
):
sum = queryset.filter(
accounting_type__movement_type=movement_type, simpleaccounting_type=sat
).aggregate(amount_sum=Sum("amount"))["amount_sum"]
if sat:
sat = sat.label
else:
sat = ""
if sum:
total_sum += sum
statement[sat] = sum
ret[movement_type] = statement
ret[movement_type + "_sum"] = total_sum
return ret
def big_statement(self):
label_list = (
self.object.operations.order_by("label").values_list("label").distinct()
)
labels = Label.objects.filter(id__in=label_list).all()
statement = collections.OrderedDict()
gen_statement = collections.OrderedDict()
no_label_statement = collections.OrderedDict()
gen_statement.update(self.statement(self.object.operations.all(), "CREDIT"))
gen_statement.update(self.statement(self.object.operations.all(), "DEBIT"))
statement[_("General statement")] = gen_statement
no_label_statement.update(
self.statement(self.object.operations.filter(label=None).all(), "CREDIT")
)
no_label_statement.update(
self.statement(self.object.operations.filter(label=None).all(), "DEBIT")
)
statement[_("No label operations")] = no_label_statement
for l in labels:
l_stmt = collections.OrderedDict()
l_stmt.update(
self.statement(self.object.operations.filter(label=l).all(), "CREDIT")
)
l_stmt.update(
self.statement(self.object.operations.filter(label=l).all(), "DEBIT")
)
statement[l] = l_stmt
return statement
def get_context_data(self, **kwargs):
""" Add infos to the context """
kwargs = super(JournalNatureStatementView, self).get_context_data(**kwargs)
kwargs["statement"] = self.big_statement()
return kwargs
class JournalPersonStatementView(JournalTabsMixin, CanViewMixin, DetailView):
"""
Calculate a dictionary with operation target and sum of operations
"""
model = GeneralJournal
pk_url_kwarg = "j_id"
template_name = "accounting/journal_statement_person.jinja"
current_tab = "person_statement"
def sum_by_target(self, target_id, target_type, movement_type):
return self.object.operations.filter(
accounting_type__movement_type=movement_type,
target_id=target_id,
target_type=target_type,
).aggregate(amount_sum=Sum("amount"))["amount_sum"]
def statement(self, movement_type):
statement = collections.OrderedDict()
for op in (
self.object.operations.filter(accounting_type__movement_type=movement_type)
.order_by("target_type", "target_id")
.distinct()
):
statement[op.target] = self.sum_by_target(
op.target_id, op.target_type, movement_type
)
return statement
def total(self, movement_type):
return sum(self.statement(movement_type).values())
def get_context_data(self, **kwargs):
""" Add journal to the context """
kwargs = super(JournalPersonStatementView, self).get_context_data(**kwargs)
kwargs["credit_statement"] = self.statement("CREDIT")
kwargs["debit_statement"] = self.statement("DEBIT")
kwargs["total_credit"] = self.total("CREDIT")
kwargs["total_debit"] = self.total("DEBIT")
return kwargs
class JournalAccountingStatementView(JournalTabsMixin, CanViewMixin, DetailView):
"""
Calculate a dictionary with operation type and sum of operations
"""
model = GeneralJournal
pk_url_kwarg = "j_id"
template_name = "accounting/journal_statement_accounting.jinja"
current_tab = "accounting_statement"
def statement(self):
statement = collections.OrderedDict()
for at in AccountingType.objects.order_by("code").all():
sum_by_type = self.object.operations.filter(
accounting_type__code__startswith=at.code
).aggregate(amount_sum=Sum("amount"))["amount_sum"]
if sum_by_type:
statement[at] = sum_by_type
return statement
def get_context_data(self, **kwargs):
""" Add journal to the context """
kwargs = super(JournalAccountingStatementView, self).get_context_data(**kwargs)
kwargs["statement"] = self.statement()
return kwargs
# Company views
class CompanyListView(CanViewMixin, ListView):
model = Company
template_name = "accounting/co_list.jinja"
class CompanyCreateView(CanCreateMixin, CreateView):
"""
Create a company
"""
model = Company
fields = ["name"]
template_name = "core/create.jinja"
success_url = reverse_lazy("accounting:co_list")
class CompanyEditView(CanCreateMixin, UpdateView):
"""
Edit a company
"""
model = Company
pk_url_kwarg = "co_id"
fields = ["name"]
template_name = "core/edit.jinja"
success_url = reverse_lazy("accounting:co_list")
# Label views
class LabelListView(CanViewMixin, DetailView):
model = ClubAccount
pk_url_kwarg = "clubaccount_id"
template_name = "accounting/label_list.jinja"
class LabelCreateView(
CanCreateMixin, CreateView
): # FIXME we need to check the rights before creating the object
model = Label
form_class = modelform_factory(
Label, fields=["name", "club_account"], widgets={"club_account": HiddenInput}
)
template_name = "core/create.jinja"
def get_initial(self):
ret = super(LabelCreateView, self).get_initial()
if "parent" in self.request.GET.keys():
obj = ClubAccount.objects.filter(id=int(self.request.GET["parent"])).first()
if obj is not None:
ret["club_account"] = obj.id
return ret
class LabelEditView(CanEditMixin, UpdateView):
model = Label
pk_url_kwarg = "label_id"
fields = ["name"]
template_name = "core/edit.jinja"
class LabelDeleteView(CanEditMixin, DeleteView):
model = Label
pk_url_kwarg = "label_id"
template_name = "core/delete_confirm.jinja"
def get_success_url(self):
return self.object.get_absolute_url()
class CloseCustomerAccountForm(forms.Form):
user = AutoCompleteSelectField(
"users", label=_("Refound this account"), help_text=None, required=True
)
class RefoundAccountView(FormView):
"""
Create a selling with the same amount than the current user money
"""
template_name = "accounting/refound_account.jinja"
form_class = CloseCustomerAccountForm
def permission(self, user):
if user.is_root or user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID):
return True
else:
raise PermissionDenied
def dispatch(self, request, *arg, **kwargs):
res = super(RefoundAccountView, self).dispatch(request, *arg, **kwargs)
if self.permission(request.user):
return res
def post(self, request, *arg, **kwargs):
self.operator = request.user
if self.permission(request.user):
return super(RefoundAccountView, self).post(self, request, *arg, **kwargs)
def form_valid(self, form):
self.customer = form.cleaned_data["user"]
self.create_selling()
return super(RefoundAccountView, self).form_valid(form)
def get_success_url(self):
return reverse("accounting:refound_account")
def create_selling(self):
with transaction.atomic():
uprice = self.customer.customer.amount
refound_club_counter = Counter.objects.get(
id=settings.SITH_COUNTER_REFOUND_ID
)
refound_club = refound_club_counter.club
s = Selling(
label=_("Refound account"),
unit_price=uprice,
quantity=1,
seller=self.operator,
customer=self.customer.customer,
club=refound_club,
counter=refound_club_counter,
product=Product.objects.get(id=settings.SITH_PRODUCT_REFOUND_ID),
)
s.save()
+23
View File
@@ -0,0 +1,23 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
+27
View File
@@ -0,0 +1,27 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from django.contrib import admin
# Register your models here.
+27
View File
@@ -0,0 +1,27 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from django.db import models
# Create your models here.
+27
View File
@@ -0,0 +1,27 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from django.test import TestCase
# Create your tests here.
+56
View File
@@ -0,0 +1,56 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from django.conf.urls import url, include
from api.views import *
from rest_framework import routers
# Router config
router = routers.DefaultRouter()
router.register(r"counter", CounterViewSet, base_name="api_counter")
router.register(r"user", UserViewSet, base_name="api_user")
router.register(r"club", ClubViewSet, base_name="api_club")
router.register(r"group", GroupViewSet, base_name="api_group")
# Launderette
router.register(
r"launderette/place", LaunderettePlaceViewSet, base_name="api_launderette_place"
)
router.register(
r"launderette/machine",
LaunderetteMachineViewSet,
base_name="api_launderette_machine",
)
router.register(
r"launderette/token", LaunderetteTokenViewSet, base_name="api_launderette_token"
)
urlpatterns = [
# API
url(r"^", include(router.urls)),
url(r"^login/", include("rest_framework.urls", namespace="rest_framework")),
url(r"^markdown$", RenderMarkdown, name="api_markdown"),
url(r"^mailings$", FetchMailingLists, name="mailings_fetch"),
]
+79
View File
@@ -0,0 +1,79 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from rest_framework.response import Response
from rest_framework import viewsets
from django.core.exceptions import PermissionDenied
from rest_framework.decorators import detail_route
from django.db.models.query import QuerySet
from core.views import can_view, can_edit
def check_if(obj, user, test):
"""
Detect if it's a single object or a queryset
aply a given test on individual object and return global permission
"""
if isinstance(obj, QuerySet):
for o in obj:
if test(o, user) is False:
return False
return True
else:
return test(obj, user)
class ManageModelMixin:
@detail_route()
def id(self, request, pk=None):
"""
Get by id (api/v1/router/{pk}/id/)
"""
self.queryset = get_object_or_404(self.queryset.filter(id=pk))
serializer = self.get_serializer(self.queryset)
return Response(serializer.data)
class RightModelViewSet(ManageModelMixin, viewsets.ModelViewSet):
def dispatch(self, request, *arg, **kwargs):
res = super(RightModelViewSet, self).dispatch(request, *arg, **kwargs)
obj = self.queryset
user = self.request.user
try:
if request.method == "GET" and check_if(obj, user, can_view):
return res
if request.method != "GET" and check_if(obj, user, can_edit):
return res
except:
pass # To prevent bug with Anonymous user
raise PermissionDenied
from .api import *
from .counter import *
from .user import *
from .club import *
from .group import *
from .launderette import *
+43
View File
@@ -0,0 +1,43 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from rest_framework.response import Response
from rest_framework.decorators import api_view, renderer_classes
from rest_framework.renderers import StaticHTMLRenderer
from rest_framework.views import APIView
from core.templatetags.renderer import markdown
@api_view(["POST"])
@renderer_classes((StaticHTMLRenderer,))
def RenderMarkdown(request):
"""
Render Markdown
"""
try:
data = markdown(request.POST["text"])
except:
data = "Error"
return Response(data)
+64
View File
@@ -0,0 +1,64 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from rest_framework.response import Response
from rest_framework import serializers
from rest_framework.decorators import api_view, renderer_classes
from rest_framework.renderers import StaticHTMLRenderer
from django.conf import settings
from django.core.exceptions import PermissionDenied
from club.models import Club, Mailing
from api.views import RightModelViewSet
class ClubSerializer(serializers.ModelSerializer):
class Meta:
model = Club
fields = ("id", "name", "unix_name", "address", "members")
class ClubViewSet(RightModelViewSet):
"""
Manage Clubs (api/v1/club/)
"""
serializer_class = ClubSerializer
queryset = Club.objects.all()
@api_view(["GET"])
@renderer_classes((StaticHTMLRenderer,))
def FetchMailingLists(request):
key = request.GET.get("key", "")
if key != settings.SITH_MAILING_FETCH_KEY:
raise PermissionDenied
data = ""
for mailing in Mailing.objects.filter(
is_moderated=True, club__is_active=True
).all():
data += mailing.fetch_format() + "\n"
return Response(data)
+61
View File
@@ -0,0 +1,61 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.decorators import list_route
from counter.models import Counter
from api.views import RightModelViewSet
class CounterSerializer(serializers.ModelSerializer):
is_open = serializers.BooleanField(read_only=True)
barman_list = serializers.ListField(
child=serializers.IntegerField(), read_only=True
)
class Meta:
model = Counter
fields = ("id", "name", "type", "club", "products", "is_open", "barman_list")
class CounterViewSet(RightModelViewSet):
"""
Manage Counters (api/v1/counter/)
"""
serializer_class = CounterSerializer
queryset = Counter.objects.all()
@list_route()
def bar(self, request):
"""
Return all bars (api/v1/counter/bar/)
"""
self.queryset = self.queryset.filter(type="BAR")
serializer = self.get_serializer(self.queryset, many=True)
return Response(serializer.data)
+43
View File
@@ -0,0 +1,43 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from rest_framework import serializers
from core.models import RealGroup
from api.views import RightModelViewSet
class GroupSerializer(serializers.ModelSerializer):
class Meta:
model = RealGroup
class GroupViewSet(RightModelViewSet):
"""
Manage Groups (api/v1/group/)
"""
serializer_class = GroupSerializer
queryset = RealGroup.objects.all()
+137
View File
@@ -0,0 +1,137 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.decorators import list_route
from launderette.models import Launderette, Machine, Token
from api.views import RightModelViewSet
class LaunderettePlaceSerializer(serializers.ModelSerializer):
machine_list = serializers.ListField(
child=serializers.IntegerField(), read_only=True
)
token_list = serializers.ListField(child=serializers.IntegerField(), read_only=True)
class Meta:
model = Launderette
fields = (
"id",
"name",
"counter",
"machine_list",
"token_list",
"get_absolute_url",
)
class LaunderetteMachineSerializer(serializers.ModelSerializer):
class Meta:
model = Machine
fields = ("id", "name", "type", "is_working", "launderette")
class LaunderetteTokenSerializer(serializers.ModelSerializer):
class Meta:
model = Token
fields = (
"id",
"name",
"type",
"launderette",
"borrow_date",
"user",
"is_avaliable",
)
class LaunderettePlaceViewSet(RightModelViewSet):
"""
Manage Launderette (api/v1/launderette/place/)
"""
serializer_class = LaunderettePlaceSerializer
queryset = Launderette.objects.all()
class LaunderetteMachineViewSet(RightModelViewSet):
"""
Manage Washing Machines (api/v1/launderette/machine/)
"""
serializer_class = LaunderetteMachineSerializer
queryset = Machine.objects.all()
class LaunderetteTokenViewSet(RightModelViewSet):
"""
Manage Launderette's tokens (api/v1/launderette/token/)
"""
serializer_class = LaunderetteTokenSerializer
queryset = Token.objects.all()
@list_route()
def washing(self, request):
"""
Return all washing tokens (api/v1/launderette/token/washing)
"""
self.queryset = self.queryset.filter(type="WASHING")
serializer = self.get_serializer(self.queryset, many=True)
return Response(serializer.data)
@list_route()
def drying(self, request):
"""
Return all drying tokens (api/v1/launderette/token/drying)
"""
self.queryset = self.queryset.filter(type="DRYING")
serializer = self.get_serializer(self.queryset, many=True)
return Response(serializer.data)
@list_route()
def avaliable(self, request):
"""
Return all avaliable tokens (api/v1/launderette/token/avaliable)
"""
self.queryset = self.queryset.filter(
borrow_date__isnull=True, user__isnull=True
)
serializer = self.get_serializer(self.queryset, many=True)
return Response(serializer.data)
@list_route()
def unavaliable(self, request):
"""
Return all unavaliable tokens (api/v1/launderette/token/unavaliable)
"""
self.queryset = self.queryset.filter(
borrow_date__isnull=False, user__isnull=False
)
serializer = self.get_serializer(self.queryset, many=True)
return Response(serializer.data)
+68
View File
@@ -0,0 +1,68 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
import datetime
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.decorators import list_route
from core.models import User
from api.views import RightModelViewSet
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = (
"id",
"first_name",
"last_name",
"email",
"date_of_birth",
"nick_name",
"is_active",
"date_joined",
)
class UserViewSet(RightModelViewSet):
"""
Manage Users (api/v1/user/)
Only show active users
"""
serializer_class = UserSerializer
queryset = User.objects.filter(is_active=True)
@list_route()
def birthday(self, request):
"""
Return all users born today (api/v1/user/birstdays)
"""
date = datetime.datetime.today()
self.queryset = self.queryset.filter(date_of_birth=date)
serializer = self.get_serializer(self.queryset, many=True)
return Response(serializer.data)
-237
View File
@@ -1,237 +0,0 @@
/* Avoid breaking parameter names, etc. in table cells. */
.doc-contents td code {
word-break: normal !important;
}
/* No line break before first paragraph of descriptions. */
.doc-md-description,
.doc-md-description>p:first-child {
display: inline;
}
/* No text transformation from Material for MkDocs for H5 headings. */
.md-typeset h5 .doc-object-name {
text-transform: none;
}
/* Max width for docstring sections tables. */
.doc .md-typeset__table,
.doc .md-typeset__table table {
display: table !important;
width: 100%;
}
.doc .md-typeset__table tr {
display: table-row;
}
/* Defaults in Spacy table style. */
.doc-param-default,
.doc-type_param-default {
float: right;
}
/* Parameter headings must be inline, not blocks. */
.doc-heading-parameter,
.doc-heading-type_parameter {
display: inline;
}
/* Default font size for parameter headings. */
.md-typeset .doc-heading-parameter {
font-size: inherit;
}
/* Prefer space on the right, not the left of parameter permalinks. */
.doc-heading-parameter .headerlink,
.doc-heading-type_parameter .headerlink {
margin-left: 0 !important;
margin-right: 0.2rem;
}
/* Backward-compatibility: docstring section titles in bold. */
.doc-section-title {
font-weight: bold;
}
/* Backlinks crumb separator. */
.doc-backlink-crumb {
display: inline-flex;
gap: .2rem;
white-space: nowrap;
align-items: center;
vertical-align: middle;
}
.doc-backlink-crumb:not(:first-child)::before {
background-color: var(--md-default-fg-color--lighter);
content: "";
display: inline;
height: 1rem;
--md-path-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6z"/></svg>');
-webkit-mask-image: var(--md-path-icon);
mask-image: var(--md-path-icon);
width: 1rem;
}
.doc-backlink-crumb.last {
font-weight: bold;
}
/* Symbols in Navigation and ToC. */
:root, :host,
[data-md-color-scheme="default"] {
--doc-symbol-parameter-fg-color: #df50af;
--doc-symbol-type_parameter-fg-color: #df50af;
--doc-symbol-attribute-fg-color: #953800;
--doc-symbol-function-fg-color: #8250df;
--doc-symbol-method-fg-color: #8250df;
--doc-symbol-class-fg-color: #0550ae;
--doc-symbol-type_alias-fg-color: #0550ae;
--doc-symbol-module-fg-color: #5cad0f;
--doc-symbol-parameter-bg-color: #df50af1a;
--doc-symbol-type_parameter-bg-color: #df50af1a;
--doc-symbol-attribute-bg-color: #9538001a;
--doc-symbol-function-bg-color: #8250df1a;
--doc-symbol-method-bg-color: #8250df1a;
--doc-symbol-class-bg-color: #0550ae1a;
--doc-symbol-type_alias-bg-color: #0550ae1a;
--doc-symbol-module-bg-color: #5cad0f1a;
}
[data-md-color-scheme="slate"] {
--doc-symbol-parameter-fg-color: #ffa8cc;
--doc-symbol-type_parameter-fg-color: #ffa8cc;
--doc-symbol-attribute-fg-color: #ffa657;
--doc-symbol-function-fg-color: #d2a8ff;
--doc-symbol-method-fg-color: #d2a8ff;
--doc-symbol-class-fg-color: #79c0ff;
--doc-symbol-type_alias-fg-color: #79c0ff;
--doc-symbol-module-fg-color: #baff79;
--doc-symbol-parameter-bg-color: #ffa8cc1a;
--doc-symbol-type_parameter-bg-color: #ffa8cc1a;
--doc-symbol-attribute-bg-color: #ffa6571a;
--doc-symbol-function-bg-color: #d2a8ff1a;
--doc-symbol-method-bg-color: #d2a8ff1a;
--doc-symbol-class-bg-color: #79c0ff1a;
--doc-symbol-type_alias-bg-color: #79c0ff1a;
--doc-symbol-module-bg-color: #baff791a;
}
code.doc-symbol {
border-radius: .1rem;
font-size: .85em;
padding: 0 .3em;
font-weight: bold;
}
code.doc-symbol-parameter,
a code.doc-symbol-parameter {
color: var(--doc-symbol-parameter-fg-color);
background-color: var(--doc-symbol-parameter-bg-color);
}
code.doc-symbol-parameter::after {
content: "param";
}
code.doc-symbol-type_parameter,
a code.doc-symbol-type_parameter {
color: var(--doc-symbol-type_parameter-fg-color);
background-color: var(--doc-symbol-type_parameter-bg-color);
}
code.doc-symbol-type_parameter::after {
content: "type-param";
}
code.doc-symbol-attribute,
a code.doc-symbol-attribute {
color: var(--doc-symbol-attribute-fg-color);
background-color: var(--doc-symbol-attribute-bg-color);
}
code.doc-symbol-attribute::after {
content: "attr";
}
code.doc-symbol-function,
a code.doc-symbol-function {
color: var(--doc-symbol-function-fg-color);
background-color: var(--doc-symbol-function-bg-color);
}
code.doc-symbol-function::after {
content: "func";
}
code.doc-symbol-method,
a code.doc-symbol-method {
color: var(--doc-symbol-method-fg-color);
background-color: var(--doc-symbol-method-bg-color);
}
code.doc-symbol-method::after {
content: "meth";
}
code.doc-symbol-class,
a code.doc-symbol-class {
color: var(--doc-symbol-class-fg-color);
background-color: var(--doc-symbol-class-bg-color);
}
code.doc-symbol-class::after {
content: "class";
}
code.doc-symbol-type_alias,
a code.doc-symbol-type_alias {
color: var(--doc-symbol-type_alias-fg-color);
background-color: var(--doc-symbol-type_alias-bg-color);
}
code.doc-symbol-type_alias::after {
content: "type";
}
code.doc-symbol-module,
a code.doc-symbol-module {
color: var(--doc-symbol-module-fg-color);
background-color: var(--doc-symbol-module-bg-color);
}
code.doc-symbol-module::after {
content: "mod";
}
.doc-signature .autorefs {
color: inherit;
border-bottom: 1px dotted currentcolor;
}
/* Source code blocks (admonitions). */
:root {
--md-admonition-icon--mkdocstrings-source: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.22 4.97a.75.75 0 0 1 1.06 0l6.5 6.5a.75.75 0 0 1 0 1.06l-6.5 6.5a.749.749 0 0 1-1.275-.326.75.75 0 0 1 .215-.734L21.19 12l-5.97-5.97a.75.75 0 0 1 0-1.06m-6.44 0a.75.75 0 0 1 0 1.06L2.81 12l5.97 5.97a.749.749 0 0 1-.326 1.275.75.75 0 0 1-.734-.215l-6.5-6.5a.75.75 0 0 1 0-1.06l6.5-6.5a.75.75 0 0 1 1.06 0"/></svg>')
}
.md-typeset .admonition.mkdocstrings-source,
.md-typeset details.mkdocstrings-source {
border: none;
padding: 0;
}
.md-typeset .admonition.mkdocstrings-source:focus-within,
.md-typeset details.mkdocstrings-source:focus-within {
box-shadow: none;
}
.md-typeset .mkdocstrings-source > .admonition-title,
.md-typeset .mkdocstrings-source > summary {
background-color: inherit;
}
.md-typeset .mkdocstrings-source > .admonition-title::before,
.md-typeset .mkdocstrings-source > summary::before {
background-color: var(--md-default-fg-color);
-webkit-mask-image: var(--md-admonition-icon--mkdocstrings-source);
mask-image: var(--md-admonition-icon--mkdocstrings-source);
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-18
View File
@@ -1,18 +0,0 @@
/*!
* Lunr languages, `Danish` language
* https://github.com/MihaiValentin/lunr-languages
*
* Copyright 2014, Mihai Valentin
* http://www.mozilla.org/MPL/
*/
/*!
* based on
* Snowball JavaScript Library v0.3
* http://code.google.com/p/urim/
* http://snowball.tartarus.org/
*
* Copyright 2010, Oleg Mazko
* http://www.mozilla.org/MPL/
*/
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=function(){var r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){function e(){var e,r=f.cursor+3;if(d=f.limit,0<=r&&r<=f.limit){for(a=r;;){if(e=f.cursor,f.in_grouping(w,97,248)){f.cursor=e;break}if(f.cursor=e,e>=f.limit)return;f.cursor++}for(;!f.out_grouping(w,97,248);){if(f.cursor>=f.limit)return;f.cursor++}d=f.cursor,d<a&&(d=a)}}function n(){var e,r;if(f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(c,32),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del();break;case 2:f.in_grouping_b(p,97,229)&&f.slice_del()}}function t(){var e,r=f.limit-f.cursor;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.find_among_b(l,4)?(f.bra=f.cursor,f.limit_backward=e,f.cursor=f.limit-r,f.cursor>f.limit_backward&&(f.cursor--,f.bra=f.cursor,f.slice_del())):f.limit_backward=e)}function s(){var e,r,i,n=f.limit-f.cursor;if(f.ket=f.cursor,f.eq_s_b(2,"st")&&(f.bra=f.cursor,f.eq_s_b(2,"ig")&&f.slice_del()),f.cursor=f.limit-n,f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(m,5),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del(),i=f.limit-f.cursor,t(),f.cursor=f.limit-i;break;case 2:f.slice_from("løs")}}function o(){var e;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.out_grouping_b(w,97,248)?(f.bra=f.cursor,u=f.slice_to(u),f.limit_backward=e,f.eq_v_b(u)&&f.slice_del()):f.limit_backward=e)}var a,d,u,c=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],l=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],w=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],p=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],f=new i;this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var r=f.cursor;return e(),f.limit_backward=r,f.cursor=f.limit,n(),f.cursor=f.limit,t(),f.cursor=f.limit,s(),f.cursor=f.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}});
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-1
View File
@@ -1 +0,0 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hi=function(){this.pipeline.reset(),this.pipeline.add(e.hi.trimmer,e.hi.stopWordFilter,e.hi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hi.stemmer))},e.hi.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿa-zA-Z-zA-0-9-",e.hi.trimmer=e.trimmerSupport.generateTrimmer(e.hi.wordCharacters),e.Pipeline.registerFunction(e.hi.trimmer,"trimmer-hi"),e.hi.stopWordFilter=e.generateStopWordFilter("अत अपना अपनी अपने अभी अंदर आदि आप इत्यादि इन इनका इन्हीं इन्हें इन्हों इस इसका इसकी इसके इसमें इसी इसे उन उनका उनकी उनके उनको उन्हीं उन्हें उन्हों उस उसके उसी उसे एक एवं एस ऐसे और कई कर करता करते करना करने करें कहते कहा का काफ़ी कि कितना किन्हें किन्हों किया किर किस किसी किसे की कुछ कुल के को कोई कौन कौनसा गया घर जब जहाँ जा जितना जिन जिन्हें जिन्हों जिस जिसे जीधर जैसा जैसे जो तक तब तरह तिन तिन्हें तिन्हों तिस तिसे तो था थी थे दबारा दिया दुसरा दूसरे दो द्वारा न नके नहीं ना निहायत नीचे ने पर पहले पूरा पे फिर बनी बही बहुत बाद बाला बिलकुल भी भीतर मगर मानो मे में यदि यह यहाँ यही या यिह ये रखें रहा रहे ऱ्वासा लिए लिये लेकिन व वग़ैरह वर्ग वह वहाँ वहीं वाले वुह वे वो सकता सकते सबसे सभी साथ साबुत साभ सारा से सो संग ही हुआ हुई हुए है हैं हो होता होती होते होना होने".split(" ")),e.hi.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.hi.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var t=i.toString().toLowerCase().replace(/^\s+/,"");return r.cut(t).split("|")},e.Pipeline.registerFunction(e.hi.stemmer,"stemmer-hi"),e.Pipeline.registerFunction(e.hi.stopWordFilter,"stopWordFilter-hi")}});
File diff suppressed because one or more lines are too long
-1
View File
@@ -1 +0,0 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hy=function(){this.pipeline.reset(),this.pipeline.add(e.hy.trimmer,e.hy.stopWordFilter)},e.hy.wordCharacters="[A-Za-z԰-֏ff-ﭏ]",e.hy.trimmer=e.trimmerSupport.generateTrimmer(e.hy.wordCharacters),e.Pipeline.registerFunction(e.hy.trimmer,"trimmer-hy"),e.hy.stopWordFilter=e.generateStopWordFilter("դու և եք էիր էիք հետո նաև նրանք որը վրա է որ պիտի են այս մեջ ն իր ու ի այդ որոնք այն կամ էր մի ես համար այլ իսկ էին ենք հետ ին թ էինք մենք նրա նա դուք եմ էի ըստ որպես ում".split(" ")),e.Pipeline.registerFunction(e.hy.stopWordFilter,"stopWordFilter-hy"),e.hy.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}(),e.Pipeline.registerFunction(e.hy.stemmer,"stemmer-hy")}});
File diff suppressed because one or more lines are too long
-1
View File
@@ -1 +0,0 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.ja=function(){this.pipeline.reset(),this.pipeline.add(e.ja.trimmer,e.ja.stopWordFilter,e.ja.stemmer),r?this.tokenizer=e.ja.tokenizer:(e.tokenizer&&(e.tokenizer=e.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.ja.tokenizer))};var t=new e.TinySegmenter;e.ja.tokenizer=function(i){var n,o,s,p,a,u,m,l,c,f;if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t.toLowerCase()):t.toLowerCase()});for(o=i.toString().toLowerCase().replace(/^\s+/,""),n=o.length-1;n>=0;n--)if(/\S/.test(o.charAt(n))){o=o.substring(0,n+1);break}for(a=[],s=o.length,c=0,l=0;c<=s;c++)if(u=o.charAt(c),m=c-l,u.match(/\s/)||c==s){if(m>0)for(p=t.segment(o.slice(l,c)).filter(function(e){return!!e}),f=l,n=0;n<p.length;n++)r?a.push(new e.Token(p[n],{position:[f,p[n].length],index:a.length})):a.push(p[n]),f+=p[n].length;l=c+1}return a},e.ja.stemmer=function(){return function(e){return e}}(),e.Pipeline.registerFunction(e.ja.stemmer,"stemmer-ja"),e.ja.wordCharacters="一二三四五六七八九十百千万億兆一-龠々〆ヵヶぁ-んァ-ヴーア-ン゙a-zA-Z-zA-0-9-",e.ja.trimmer=e.trimmerSupport.generateTrimmer(e.ja.wordCharacters),e.Pipeline.registerFunction(e.ja.trimmer,"trimmer-ja"),e.ja.stopWordFilter=e.generateStopWordFilter("これ それ あれ この その あの ここ そこ あそこ こちら どこ だれ なに なん 何 私 貴方 貴方方 我々 私達 あの人 あのかた 彼女 彼 です あります おります います は が の に を で え から まで より も どの と し それで しかし".split(" ")),e.Pipeline.registerFunction(e.ja.stopWordFilter,"stopWordFilter-ja"),e.jp=e.ja,e.Pipeline.registerFunction(e.jp.stemmer,"stemmer-jp"),e.Pipeline.registerFunction(e.jp.trimmer,"trimmer-jp"),e.Pipeline.registerFunction(e.jp.stopWordFilter,"stopWordFilter-jp")}});
-1
View File
@@ -1 +0,0 @@
module.exports=require("./lunr.ja");
-1
View File
@@ -1 +0,0 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.kn=function(){this.pipeline.reset(),this.pipeline.add(e.kn.trimmer,e.kn.stopWordFilter,e.kn.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.kn.stemmer))},e.kn.wordCharacters="ಀ-಄ಅ-ಔಕ-ಹಾ-ೌ಼-ಽೕ-ೖೝ-ೞೠ-ೡೢ-ೣ೤೥೦-೯ೱ-ೳ",e.kn.trimmer=e.trimmerSupport.generateTrimmer(e.kn.wordCharacters),e.Pipeline.registerFunction(e.kn.trimmer,"trimmer-kn"),e.kn.stopWordFilter=e.generateStopWordFilter("ಮತ್ತು ಈ ಒಂದು ರಲ್ಲಿ ಹಾಗೂ ಎಂದು ಅಥವಾ ಇದು ರ ಅವರು ಎಂಬ ಮೇಲೆ ಅವರ ತನ್ನ ಆದರೆ ತಮ್ಮ ನಂತರ ಮೂಲಕ ಹೆಚ್ಚು ನ ಆ ಕೆಲವು ಅನೇಕ ಎರಡು ಹಾಗು ಪ್ರಮುಖ ಇದನ್ನು ಇದರ ಸುಮಾರು ಅದರ ಅದು ಮೊದಲ ಬಗ್ಗೆ ನಲ್ಲಿ ರಂದು ಇತರ ಅತ್ಯಂತ ಹೆಚ್ಚಿನ ಸಹ ಸಾಮಾನ್ಯವಾಗಿ ನೇ ಹಲವಾರು ಹೊಸ ದಿ ಕಡಿಮೆ ಯಾವುದೇ ಹೊಂದಿದೆ ದೊಡ್ಡ ಅನ್ನು ಇವರು ಪ್ರಕಾರ ಇದೆ ಮಾತ್ರ ಕೂಡ ಇಲ್ಲಿ ಎಲ್ಲಾ ವಿವಿಧ ಅದನ್ನು ಹಲವು ರಿಂದ ಕೇವಲ ದ ದಕ್ಷಿಣ ಗೆ ಅವನ ಅತಿ ನೆಯ ಬಹಳ ಕೆಲಸ ಎಲ್ಲ ಪ್ರತಿ ಇತ್ಯಾದಿ ಇವು ಬೇರೆ ಹೀಗೆ ನಡುವೆ ಇದಕ್ಕೆ ಎಸ್ ಇವರ ಮೊದಲು ಶ್ರೀ ಮಾಡುವ ಇದರಲ್ಲಿ ರೀತಿಯ ಮಾಡಿದ ಕಾಲ ಅಲ್ಲಿ ಮಾಡಲು ಅದೇ ಈಗ ಅವು ಗಳು ಎ ಎಂಬುದು ಅವನು ಅಂದರೆ ಅವರಿಗೆ ಇರುವ ವಿಶೇಷ ಮುಂದೆ ಅವುಗಳ ಮುಂತಾದ ಮೂಲ ಬಿ ಮೀ ಒಂದೇ ಇನ್ನೂ ಹೆಚ್ಚಾಗಿ ಮಾಡಿ ಅವರನ್ನು ಇದೇ ಯ ರೀತಿಯಲ್ಲಿ ಜೊತೆ ಅದರಲ್ಲಿ ಮಾಡಿದರು ನಡೆದ ಆಗ ಮತ್ತೆ ಪೂರ್ವ ಆತ ಬಂದ ಯಾವ ಒಟ್ಟು ಇತರೆ ಹಿಂದೆ ಪ್ರಮಾಣದ ಗಳನ್ನು ಕುರಿತು ಯು ಆದ್ದರಿಂದ ಅಲ್ಲದೆ ನಗರದ ಮೇಲಿನ ಏಕೆಂದರೆ ರಷ್ಟು ಎಂಬುದನ್ನು ಬಾರಿ ಎಂದರೆ ಹಿಂದಿನ ಆದರೂ ಆದ ಸಂಬಂಧಿಸಿದ ಮತ್ತೊಂದು ಸಿ ಆತನ ".split(" ")),e.kn.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.kn.tokenizer=function(t){if(!arguments.length||null==t||void 0==t)return[];if(Array.isArray(t))return t.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var n=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(n).split("|")},e.Pipeline.registerFunction(e.kn.stemmer,"stemmer-kn"),e.Pipeline.registerFunction(e.kn.stopWordFilter,"stopWordFilter-kn")}});
File diff suppressed because one or more lines are too long
-1
View File
@@ -1 +0,0 @@
!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){e.multiLanguage=function(){for(var t=Array.prototype.slice.call(arguments),i=t.join("-"),r="",n=[],s=[],p=0;p<t.length;++p)"en"==t[p]?(r+="\\w",n.unshift(e.stopWordFilter),n.push(e.stemmer),s.push(e.stemmer)):(r+=e[t[p]].wordCharacters,e[t[p]].stopWordFilter&&n.unshift(e[t[p]].stopWordFilter),e[t[p]].stemmer&&(n.push(e[t[p]].stemmer),s.push(e[t[p]].stemmer)));var o=e.trimmerSupport.generateTrimmer(r);return e.Pipeline.registerFunction(o,"lunr-multi-trimmer-"+i),n.unshift(o),function(){this.pipeline.reset(),this.pipeline.add.apply(this.pipeline,n),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add.apply(this.searchPipeline,s))}}}});
File diff suppressed because one or more lines are too long
-18
View File
@@ -1,18 +0,0 @@
/*!
* Lunr languages, `Norwegian` language
* https://github.com/MihaiValentin/lunr-languages
*
* Copyright 2014, Mihai Valentin
* http://www.mozilla.org/MPL/
*/
/*!
* based on
* Snowball JavaScript Library v0.3
* http://code.google.com/p/urim/
* http://snowball.tartarus.org/
*
* Copyright 2010, Oleg Mazko
* http://www.mozilla.org/MPL/
*/
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(){var e,r=w.cursor+3;if(a=w.limit,0<=r||r<=w.limit){for(s=r;;){if(e=w.cursor,w.in_grouping(d,97,248)){w.cursor=e;break}if(e>=w.limit)return;w.cursor=e+1}for(;!w.out_grouping(d,97,248);){if(w.cursor>=w.limit)return;w.cursor++}a=w.cursor,a<s&&(a=s)}}function i(){var e,r,n;if(w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(m,29),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:n=w.limit-w.cursor,w.in_grouping_b(c,98,122)?w.slice_del():(w.cursor=w.limit-n,w.eq_s_b(1,"k")&&w.out_grouping_b(d,97,248)&&w.slice_del());break;case 3:w.slice_from("er")}}function t(){var e,r=w.limit-w.cursor;w.cursor>=a&&(e=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,w.find_among_b(u,2)?(w.bra=w.cursor,w.limit_backward=e,w.cursor=w.limit-r,w.cursor>w.limit_backward&&(w.cursor--,w.bra=w.cursor,w.slice_del())):w.limit_backward=e)}function o(){var e,r;w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(l,11),e?(w.bra=w.cursor,w.limit_backward=r,1==e&&w.slice_del()):w.limit_backward=r)}var s,a,m=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],u=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],c=[119,125,149,1],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,i(),w.cursor=w.limit,t(),w.cursor=w.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}});
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-1
View File
@@ -1 +0,0 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sa=function(){this.pipeline.reset(),this.pipeline.add(e.sa.trimmer,e.sa.stopWordFilter,e.sa.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sa.stemmer))},e.sa.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿ꣠-꣱ꣲ-ꣷ꣸-ꣻ꣼-ꣽꣾ-ꣿᆰ0-ᆰ9",e.sa.trimmer=e.trimmerSupport.generateTrimmer(e.sa.wordCharacters),e.Pipeline.registerFunction(e.sa.trimmer,"trimmer-sa"),e.sa.stopWordFilter=e.generateStopWordFilter('तथा अयम्‌ एकम्‌ इत्यस्मिन्‌ तथा तत्‌ वा अयम्‌ इत्यस्य ते आहूत उपरि तेषाम्‌ किन्तु तेषाम्‌ तदा इत्यनेन अधिकः इत्यस्य तत्‌ केचन बहवः द्वि तथा महत्वपूर्णः अयम्‌ अस्य विषये अयं अस्ति तत्‌ प्रथमः विषये इत्युपरि इत्युपरि इतर अधिकतमः अधिकः अपि सामान्यतया ठ इतरेतर नूतनम्‌ द न्यूनम्‌ कश्चित्‌ वा विशालः द सः अस्ति तदनुसारम् तत्र अस्ति केवलम्‌ अपि अत्र सर्वे विविधाः तत्‌ बहवः यतः इदानीम्‌ द दक्षिण इत्यस्मै तस्य उपरि नथ अतीव कार्यम्‌ सर्वे एकैकम्‌ इत्यादि। एते सन्ति उत इत्थम्‌ मध्ये एतदर्थं . स कस्य प्रथमः श्री. करोति अस्मिन् प्रकारः निर्मिता कालः तत्र कर्तुं समान अधुना ते सन्ति स एकः अस्ति सः अर्थात् तेषां कृते . स्थितम् विशेषः अग्रिम तेषाम्‌ समान स्रोतः ख म समान इदानीमपि अधिकतया करोतु ते समान इत्यस्य वीथी सह यस्मिन् कृतवान्‌ धृतः तदा पुनः पूर्वं सः आगतः किम्‌ कुल इतर पुरा मात्रा स विषये उ अतएव अपि नगरस्य उपरि यतः प्रतिशतं कतरः कालः साधनानि भूत तथापि जात सम्बन्धि अन्यत्‌ ग अतः अस्माकं स्वकीयाः अस्माकं इदानीं अन्तः इत्यादयः भवन्तः इत्यादयः एते एताः तस्य अस्य इदम् एते तेषां तेषां तेषां तान् तेषां तेषां तेषां समानः सः एकः च तादृशाः बहवः अन्ये च वदन्ति यत् कियत् कस्मै कस्मै यस्मै यस्मै यस्मै यस्मै न अतिनीचः किन्तु प्रथमं सम्पूर्णतया ततः चिरकालानन्तरं पुस्तकं सम्पूर्णतया अन्तः किन्तु अत्र वा इह इव श्रद्धाय अवशिष्यते परन्तु अन्ये वर्गाः सन्ति ते सन्ति शक्नुवन्ति सर्वे मिलित्वा सर्वे एकत्र"'.split(" ")),e.sa.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.sa.tokenizer=function(t){if(!arguments.length||null==t||void 0==t)return[];if(Array.isArray(t))return t.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var i=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(i).split("|")},e.Pipeline.registerFunction(e.sa.stemmer,"stemmer-sa"),e.Pipeline.registerFunction(e.sa.stopWordFilter,"stopWordFilter-sa")}});
@@ -1 +0,0 @@
!function(r,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(r.lunr)}(this,function(){return function(r){r.stemmerSupport={Among:function(r,t,i,s){if(this.toCharArray=function(r){for(var t=r.length,i=new Array(t),s=0;s<t;s++)i[s]=r.charCodeAt(s);return i},!r&&""!=r||!t&&0!=t||!i)throw"Bad Among initialisation: s:"+r+", substring_i: "+t+", result: "+i;this.s_size=r.length,this.s=this.toCharArray(r),this.substring_i=t,this.result=i,this.method=s},SnowballProgram:function(){var r;return{bra:0,ket:0,limit:0,cursor:0,limit_backward:0,setCurrent:function(t){r=t,this.cursor=0,this.limit=t.length,this.limit_backward=0,this.bra=this.cursor,this.ket=this.limit},getCurrent:function(){var t=r;return r=null,t},in_grouping:function(t,i,s){if(this.cursor<this.limit){var e=r.charCodeAt(this.cursor);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursor<this.limit){var e=r.charCodeAt(this.cursor);if(e>s||e<i)return this.cursor++,!0;if(e-=i,!(t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||e<i)return this.cursor--,!0;if(e-=i,!(t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor<t)return!1;for(var s=0;s<t;s++)if(r.charCodeAt(this.cursor+s)!=i.charCodeAt(s))return!1;return this.cursor+=t,!0},eq_s_b:function(t,i){if(this.cursor-this.limit_backward<t)return!1;for(var s=0;s<t;s++)if(r.charCodeAt(this.cursor-t+s)!=i.charCodeAt(s))return!1;return this.cursor-=t,!0},find_among:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o<h?o:h,_=t[a],m=l;m<_.s_size;m++){if(n+l==u){f=-1;break}if(f=r.charCodeAt(n+l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n+_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o<h?o:h,_=t[a],m=_.s_size-1-l;m>=0;m--){if(n-l==u){f=-1;break}if(f=r.charCodeAt(n-1-l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n-_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n-_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}});
-18
View File
@@ -1,18 +0,0 @@
/*!
* Lunr languages, `Swedish` language
* https://github.com/MihaiValentin/lunr-languages
*
* Copyright 2014, Mihai Valentin
* http://www.mozilla.org/MPL/
*/
/*!
* based on
* Snowball JavaScript Library v0.3
* http://code.google.com/p/urim/
* http://snowball.tartarus.org/
*
* Copyright 2010, Oleg Mazko
* http://www.mozilla.org/MPL/
*/
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,t=new function(){function e(){var e,r=w.cursor+3;if(o=w.limit,0<=r||r<=w.limit){for(a=r;;){if(e=w.cursor,w.in_grouping(l,97,246)){w.cursor=e;break}if(w.cursor=e,w.cursor>=w.limit)return;w.cursor++}for(;!w.out_grouping(l,97,246);){if(w.cursor>=w.limit)return;w.cursor++}o=w.cursor,o<a&&(o=a)}}function t(){var e,r=w.limit_backward;if(w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(u,37),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.in_grouping_b(d,98,121)&&w.slice_del()}}function i(){var e=w.limit_backward;w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.find_among_b(c,7)&&(w.cursor=w.limit,w.ket=w.cursor,w.cursor>w.limit_backward&&(w.bra=--w.cursor,w.slice_del())),w.limit_backward=e)}function s(){var e,r;if(w.cursor>=o){if(r=w.limit_backward,w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(m,5))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.slice_from("lös");break;case 3:w.slice_from("full")}w.limit_backward=r}}var a,o,u=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],c=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],l=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],d=[119,127,149],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,t(),w.cursor=w.limit,i(),w.cursor=w.limit,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return t.setCurrent(e),t.stem(),t.getCurrent()}):(t.setCurrent(e),t.stem(),t.getCurrent())}}(),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}});
-1
View File
@@ -1 +0,0 @@
!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ta=function(){this.pipeline.reset(),this.pipeline.add(e.ta.trimmer,e.ta.stopWordFilter,e.ta.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ta.stemmer))},e.ta.wordCharacters="஀-உஊ-ஏஐ-ஙச-ட஠-னப-யர-ஹ஺-ிீ-௉ொ-௏ௐ-௙௚-௟௠-௩௪-௯௰-௹௺-௿a-zA-Z-zA-0-9-",e.ta.trimmer=e.trimmerSupport.generateTrimmer(e.ta.wordCharacters),e.Pipeline.registerFunction(e.ta.trimmer,"trimmer-ta"),e.ta.stopWordFilter=e.generateStopWordFilter("அங்கு அங்கே அது அதை அந்த அவர் அவர்கள் அவள் அவன் அவை ஆக ஆகவே ஆகையால் ஆதலால் ஆதலினால் ஆனாலும் ஆனால் இங்கு இங்கே இது இதை இந்த இப்படி இவர் இவர்கள் இவள் இவன் இவை இவ்வளவு உனக்கு உனது உன் உன்னால் எங்கு எங்கே எது எதை எந்த எப்படி எவர் எவர்கள் எவள் எவன் எவை எவ்வளவு எனக்கு எனது எனவே என் என்ன என்னால் ஏது ஏன் தனது தன்னால் தானே தான் நாங்கள் நாம் நான் நீ நீங்கள்".split(" ")),e.ta.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.ta.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.ta.stemmer,"stemmer-ta"),e.Pipeline.registerFunction(e.ta.stopWordFilter,"stopWordFilter-ta")}});
-1
View File
@@ -1 +0,0 @@
!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.te=function(){this.pipeline.reset(),this.pipeline.add(e.te.trimmer,e.te.stopWordFilter,e.te.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.te.stemmer))},e.te.wordCharacters="ఀ-ఄఅ-ఔక-హా-ౌౕ-ౖౘ-ౚౠ-ౡౢ-ౣ౦-౯౸-౿఼ఽ్ౝ౷౤౥",e.te.trimmer=e.trimmerSupport.generateTrimmer(e.te.wordCharacters),e.Pipeline.registerFunction(e.te.trimmer,"trimmer-te"),e.te.stopWordFilter=e.generateStopWordFilter("అందరూ అందుబాటులో అడగండి అడగడం అడ్డంగా అనుగుణంగా అనుమతించు అనుమతిస్తుంది అయితే ఇప్పటికే ఉన్నారు ఎక్కడైనా ఎప్పుడు ఎవరైనా ఎవరో ఏ ఏదైనా ఏమైనప్పటికి ఒక ఒకరు కనిపిస్తాయి కాదు కూడా గా గురించి చుట్టూ చేయగలిగింది తగిన తర్వాత దాదాపు దూరంగా నిజంగా పై ప్రకారం ప్రక్కన మధ్య మరియు మరొక మళ్ళీ మాత్రమే మెచ్చుకో వద్ద వెంట వేరుగా వ్యతిరేకంగా సంబంధం".split(" ")),e.te.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.te.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.te.stemmer,"stemmer-te"),e.Pipeline.registerFunction(e.te.stopWordFilter,"stopWordFilter-te")}});
-1
View File
@@ -1 +0,0 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.th=function(){this.pipeline.reset(),this.pipeline.add(e.th.trimmer),r?this.tokenizer=e.th.tokenizer:(e.tokenizer&&(e.tokenizer=e.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.th.tokenizer))},e.th.wordCharacters="[฀-๿]",e.th.trimmer=e.trimmerSupport.generateTrimmer(e.th.wordCharacters),e.Pipeline.registerFunction(e.th.trimmer,"trimmer-th");var t=e.wordcut;t.init(),e.th.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t):t});var n=i.toString().replace(/^\s+/,"");return t.cut(n).split("|")}}});
File diff suppressed because one or more lines are too long
-1
View File
@@ -1 +0,0 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.trimmer)},e.vi.wordCharacters="[A-Za-ẓ̀͐́͑̉̃̓ÂâÊêÔôĂ-ăĐ-đƠ-ơƯ-ư]",e.vi.trimmer=e.trimmerSupport.generateTrimmer(e.vi.wordCharacters),e.Pipeline.registerFunction(e.vi.trimmer,"trimmer-vi"),e.vi.stopWordFilter=e.generateStopWordFilter("là cái nhưng mà".split(" "))}});
-1
View File
@@ -1 +0,0 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r(require("@node-rs/jieba")):r()(e.lunr)}(this,function(e){return function(r,t){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==r.version[0];r.zh=function(){this.pipeline.reset(),this.pipeline.add(r.zh.trimmer,r.zh.stopWordFilter,r.zh.stemmer),i?this.tokenizer=r.zh.tokenizer:(r.tokenizer&&(r.tokenizer=r.zh.tokenizer),this.tokenizerFn&&(this.tokenizerFn=r.zh.tokenizer))},r.zh.tokenizer=function(n){if(!arguments.length||null==n||void 0==n)return[];if(Array.isArray(n))return n.map(function(e){return i?new r.Token(e.toLowerCase()):e.toLowerCase()});t&&e.load(t);var o=n.toString().trim().toLowerCase(),s=[];e.cut(o,!0).forEach(function(e){s=s.concat(e.split(" "))}),s=s.filter(function(e){return!!e});var u=0;return s.map(function(e,t){if(i){var n=o.indexOf(e,u),s={};return s.position=[n,e.length],s.index=t,u=n,new r.Token(e,s)}return e})},r.zh.wordCharacters="\\w一-龥",r.zh.trimmer=r.trimmerSupport.generateTrimmer(r.zh.wordCharacters),r.Pipeline.registerFunction(r.zh.trimmer,"trimmer-zh"),r.zh.stemmer=function(){return function(e){return e}}(),r.Pipeline.registerFunction(r.zh.stemmer,"stemmer-zh"),r.zh.stopWordFilter=r.generateStopWordFilter("的 一 不 在 人 有 是 为 為 以 于 於 上 他 而 后 後 之 来 來 及 了 因 下 可 到 由 这 這 与 與 也 此 但 并 並 个 個 其 已 无 無 小 我 们 們 起 最 再 今 去 好 只 又 或 很 亦 某 把 那 你 乃 它 吧 被 比 别 趁 当 當 从 從 得 打 凡 儿 兒 尔 爾 该 該 各 给 給 跟 和 何 还 還 即 几 幾 既 看 据 據 距 靠 啦 另 么 麽 每 嘛 拿 哪 您 凭 憑 且 却 卻 让 讓 仍 啥 如 若 使 谁 誰 虽 雖 随 隨 同 所 她 哇 嗡 往 些 向 沿 哟 喲 用 咱 则 則 怎 曾 至 致 着 著 诸 諸 自".split(" ")),r.Pipeline.registerFunction(r.zh.stopWordFilter,"stopWordFilter-zh")}});
-206
View File
@@ -1,206 +0,0 @@
/**
* export the module via AMD, CommonJS or as a browser global
* Export code from https://github.com/umdjs/umd/blob/master/returnExports.js
*/
;(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(factory)
} else if (typeof exports === 'object') {
/**
* Node. Does not work with strict CommonJS, but
* only CommonJS-like environments that support module.exports,
* like Node.
*/
module.exports = factory()
} else {
// Browser globals (root is window)
factory()(root.lunr);
}
}(this, function () {
/**
* Just return a value to define the module export.
* This example returns an object, but the module
* can return a function as the exported value.
*/
return function(lunr) {
// TinySegmenter 0.1 -- Super compact Japanese tokenizer in Javascript
// (c) 2008 Taku Kudo <taku@chasen.org>
// TinySegmenter is freely distributable under the terms of a new BSD licence.
// For details, see http://chasen.org/~taku/software/TinySegmenter/LICENCE.txt
function TinySegmenter() {
var patterns = {
"[一二三四五六七八九十百千万億兆]":"M",
"[一-龠々〆ヵヶ]":"H",
"[ぁ-ん]":"I",
"[ァ-ヴーア-ン゙ー]":"K",
"[a-zA-Z-zA-]":"A",
"[0-9-]":"N"
}
this.chartype_ = [];
for (var i in patterns) {
var regexp = new RegExp(i);
this.chartype_.push([regexp, patterns[i]]);
}
this.BIAS__ = -332
this.BC1__ = {"HH":6,"II":2461,"KH":406,"OH":-1378};
this.BC2__ = {"AA":-3267,"AI":2744,"AN":-878,"HH":-4070,"HM":-1711,"HN":4012,"HO":3761,"IA":1327,"IH":-1184,"II":-1332,"IK":1721,"IO":5492,"KI":3831,"KK":-8741,"MH":-3132,"MK":3334,"OO":-2920};
this.BC3__ = {"HH":996,"HI":626,"HK":-721,"HN":-1307,"HO":-836,"IH":-301,"KK":2762,"MK":1079,"MM":4034,"OA":-1652,"OH":266};
this.BP1__ = {"BB":295,"OB":304,"OO":-125,"UB":352};
this.BP2__ = {"BO":60,"OO":-1762};
this.BQ1__ = {"BHH":1150,"BHM":1521,"BII":-1158,"BIM":886,"BMH":1208,"BNH":449,"BOH":-91,"BOO":-2597,"OHI":451,"OIH":-296,"OKA":1851,"OKH":-1020,"OKK":904,"OOO":2965};
this.BQ2__ = {"BHH":118,"BHI":-1159,"BHM":466,"BIH":-919,"BKK":-1720,"BKO":864,"OHH":-1139,"OHM":-181,"OIH":153,"UHI":-1146};
this.BQ3__ = {"BHH":-792,"BHI":2664,"BII":-299,"BKI":419,"BMH":937,"BMM":8335,"BNN":998,"BOH":775,"OHH":2174,"OHM":439,"OII":280,"OKH":1798,"OKI":-793,"OKO":-2242,"OMH":-2402,"OOO":11699};
this.BQ4__ = {"BHH":-3895,"BIH":3761,"BII":-4654,"BIK":1348,"BKK":-1806,"BMI":-3385,"BOO":-12396,"OAH":926,"OHH":266,"OHK":-2036,"ONN":-973};
this.BW1__ = {",と":660,",同":727,"B1あ":1404,"B1同":542,"、と":660,"、同":727,"」と":1682,"あっ":1505,"いう":1743,"いっ":-2055,"いる":672,"うし":-4817,"うん":665,"から":3472,"がら":600,"こう":-790,"こと":2083,"こん":-1262,"さら":-4143,"さん":4573,"した":2641,"して":1104,"すで":-3399,"そこ":1977,"それ":-871,"たち":1122,"ため":601,"った":3463,"つい":-802,"てい":805,"てき":1249,"でき":1127,"です":3445,"では":844,"とい":-4915,"とみ":1922,"どこ":3887,"ない":5713,"なっ":3015,"など":7379,"なん":-1113,"にし":2468,"には":1498,"にも":1671,"に対":-912,"の一":-501,"の中":741,"ませ":2448,"まで":1711,"まま":2600,"まる":-2155,"やむ":-1947,"よっ":-2565,"れた":2369,"れで":-913,"をし":1860,"を見":731,"亡く":-1886,"京都":2558,"取り":-2784,"大き":-2604,"大阪":1497,"平方":-2314,"引き":-1336,"日本":-195,"本当":-2423,"毎日":-2113,"目指":-724,"B1あ":1404,"B1同":542,"」と":1682};
this.BW2__ = {"..":-11822,"11":-669,"――":-5730,"−−":-13175,"いう":-1609,"うか":2490,"かし":-1350,"かも":-602,"から":-7194,"かれ":4612,"がい":853,"がら":-3198,"きた":1941,"くな":-1597,"こと":-8392,"この":-4193,"させ":4533,"され":13168,"さん":-3977,"しい":-1819,"しか":-545,"した":5078,"して":972,"しな":939,"その":-3744,"たい":-1253,"たた":-662,"ただ":-3857,"たち":-786,"たと":1224,"たは":-939,"った":4589,"って":1647,"っと":-2094,"てい":6144,"てき":3640,"てく":2551,"ては":-3110,"ても":-3065,"でい":2666,"でき":-1528,"でし":-3828,"です":-4761,"でも":-4203,"とい":1890,"とこ":-1746,"とと":-2279,"との":720,"とみ":5168,"とも":-3941,"ない":-2488,"なが":-1313,"など":-6509,"なの":2614,"なん":3099,"にお":-1615,"にし":2748,"にな":2454,"によ":-7236,"に対":-14943,"に従":-4688,"に関":-11388,"のか":2093,"ので":-7059,"のに":-6041,"のの":-6125,"はい":1073,"はが":-1033,"はず":-2532,"ばれ":1813,"まし":-1316,"まで":-6621,"まれ":5409,"めて":-3153,"もい":2230,"もの":-10713,"らか":-944,"らし":-1611,"らに":-1897,"りし":651,"りま":1620,"れた":4270,"れて":849,"れば":4114,"ろう":6067,"われ":7901,"を通":-11877,"んだ":728,"んな":-4115,"一人":602,"一方":-1375,"一日":970,"一部":-1051,"上が":-4479,"会社":-1116,"出て":2163,"分の":-7758,"同党":970,"同日":-913,"大阪":-2471,"委員":-1250,"少な":-1050,"年度":-8669,"年間":-1626,"府県":-2363,"手権":-1982,"新聞":-4066,"日新":-722,"日本":-7068,"日米":3372,"曜日":-601,"朝鮮":-2355,"本人":-2697,"東京":-1543,"然と":-1384,"社会":-1276,"立て":-990,"第に":-1612,"米国":-4268,"11":-669};
this.BW3__ = {"あた":-2194,"あり":719,"ある":3846,"い.":-1185,"い。":-1185,"いい":5308,"いえ":2079,"いく":3029,"いた":2056,"いっ":1883,"いる":5600,"いわ":1527,"うち":1117,"うと":4798,"えと":1454,"か.":2857,"か。":2857,"かけ":-743,"かっ":-4098,"かに":-669,"から":6520,"かり":-2670,"が,":1816,"が、":1816,"がき":-4855,"がけ":-1127,"がっ":-913,"がら":-4977,"がり":-2064,"きた":1645,"けど":1374,"こと":7397,"この":1542,"ころ":-2757,"さい":-714,"さを":976,"し,":1557,"し、":1557,"しい":-3714,"した":3562,"して":1449,"しな":2608,"しま":1200,"す.":-1310,"す。":-1310,"する":6521,"ず,":3426,"ず、":3426,"ずに":841,"そう":428,"た.":8875,"た。":8875,"たい":-594,"たの":812,"たり":-1183,"たる":-853,"だ.":4098,"だ。":4098,"だっ":1004,"った":-4748,"って":300,"てい":6240,"てお":855,"ても":302,"です":1437,"でに":-1482,"では":2295,"とう":-1387,"とし":2266,"との":541,"とも":-3543,"どう":4664,"ない":1796,"なく":-903,"など":2135,"に,":-1021,"に、":-1021,"にし":1771,"にな":1906,"には":2644,"の,":-724,"の、":-724,"の子":-1000,"は,":1337,"は、":1337,"べき":2181,"まし":1113,"ます":6943,"まっ":-1549,"まで":6154,"まれ":-793,"らし":1479,"られ":6820,"るる":3818,"れ,":854,"れ、":854,"れた":1850,"れて":1375,"れば":-3246,"れる":1091,"われ":-605,"んだ":606,"んで":798,"カ月":990,"会議":860,"入り":1232,"大会":2217,"始め":1681,"市":965,"新聞":-5055,"日,":974,"日、":974,"社会":2024,"カ月":990};
this.TC1__ = {"AAA":1093,"HHH":1029,"HHM":580,"HII":998,"HOH":-390,"HOM":-331,"IHI":1169,"IOH":-142,"IOI":-1015,"IOM":467,"MMH":187,"OOI":-1832};
this.TC2__ = {"HHO":2088,"HII":-1023,"HMM":-1154,"IHI":-1965,"KKH":703,"OII":-2649};
this.TC3__ = {"AAA":-294,"HHH":346,"HHI":-341,"HII":-1088,"HIK":731,"HOH":-1486,"IHH":128,"IHI":-3041,"IHO":-1935,"IIH":-825,"IIM":-1035,"IOI":-542,"KHH":-1216,"KKA":491,"KKH":-1217,"KOK":-1009,"MHH":-2694,"MHM":-457,"MHO":123,"MMH":-471,"NNH":-1689,"NNO":662,"OHO":-3393};
this.TC4__ = {"HHH":-203,"HHI":1344,"HHK":365,"HHM":-122,"HHN":182,"HHO":669,"HIH":804,"HII":679,"HOH":446,"IHH":695,"IHO":-2324,"IIH":321,"III":1497,"IIO":656,"IOO":54,"KAK":4845,"KKA":3386,"KKK":3065,"MHH":-405,"MHI":201,"MMH":-241,"MMM":661,"MOM":841};
this.TQ1__ = {"BHHH":-227,"BHHI":316,"BHIH":-132,"BIHH":60,"BIII":1595,"BNHH":-744,"BOHH":225,"BOOO":-908,"OAKK":482,"OHHH":281,"OHIH":249,"OIHI":200,"OIIH":-68};
this.TQ2__ = {"BIHH":-1401,"BIII":-1033,"BKAK":-543,"BOOO":-5591};
this.TQ3__ = {"BHHH":478,"BHHM":-1073,"BHIH":222,"BHII":-504,"BIIH":-116,"BIII":-105,"BMHI":-863,"BMHM":-464,"BOMH":620,"OHHH":346,"OHHI":1729,"OHII":997,"OHMH":481,"OIHH":623,"OIIH":1344,"OKAK":2792,"OKHH":587,"OKKA":679,"OOHH":110,"OOII":-685};
this.TQ4__ = {"BHHH":-721,"BHHM":-3604,"BHII":-966,"BIIH":-607,"BIII":-2181,"OAAA":-2763,"OAKK":180,"OHHH":-294,"OHHI":2446,"OHHO":480,"OHIH":-1573,"OIHH":1935,"OIHI":-493,"OIIH":626,"OIII":-4007,"OKAK":-8156};
this.TW1__ = {"につい":-4681,"東京都":2026};
this.TW2__ = {"ある程":-2049,"いった":-1256,"ころが":-2434,"しょう":3873,"その後":-4430,"だって":-1049,"ていた":1833,"として":-4657,"ともに":-4517,"もので":1882,"一気に":-792,"初めて":-1512,"同時に":-8097,"大きな":-1255,"対して":-2721,"社会党":-3216};
this.TW3__ = {"いただ":-1734,"してい":1314,"として":-4314,"につい":-5483,"にとっ":-5989,"に当た":-6247,"ので,":-727,"ので、":-727,"のもの":-600,"れから":-3752,"十二月":-2287};
this.TW4__ = {"いう.":8576,"いう。":8576,"からな":-2348,"してい":2958,"たが,":1516,"たが、":1516,"ている":1538,"という":1349,"ました":5543,"ません":1097,"ようと":-4258,"よると":5865};
this.UC1__ = {"A":484,"K":93,"M":645,"O":-505};
this.UC2__ = {"A":819,"H":1059,"I":409,"M":3987,"N":5775,"O":646};
this.UC3__ = {"A":-1370,"I":2311};
this.UC4__ = {"A":-2643,"H":1809,"I":-1032,"K":-3450,"M":3565,"N":3876,"O":6646};
this.UC5__ = {"H":313,"I":-1238,"K":-799,"M":539,"O":-831};
this.UC6__ = {"H":-506,"I":-253,"K":87,"M":247,"O":-387};
this.UP1__ = {"O":-214};
this.UP2__ = {"B":69,"O":935};
this.UP3__ = {"B":189};
this.UQ1__ = {"BH":21,"BI":-12,"BK":-99,"BN":142,"BO":-56,"OH":-95,"OI":477,"OK":410,"OO":-2422};
this.UQ2__ = {"BH":216,"BI":113,"OK":1759};
this.UQ3__ = {"BA":-479,"BH":42,"BI":1913,"BK":-7198,"BM":3160,"BN":6427,"BO":14761,"OI":-827,"ON":-3212};
this.UW1__ = {",":156,"、":156,"「":-463,"あ":-941,"う":-127,"が":-553,"き":121,"こ":505,"で":-201,"と":-547,"ど":-123,"に":-789,"の":-185,"は":-847,"も":-466,"や":-470,"よ":182,"ら":-292,"り":208,"れ":169,"を":-446,"ん":-137,"・":-135,"主":-402,"京":-268,"区":-912,"午":871,"国":-460,"大":561,"委":729,"市":-411,"日":-141,"理":361,"生":-408,"県":-386,"都":-718,"「":-463,"・":-135};
this.UW2__ = {",":-829,"、":-829,"":892,"「":-645,"」":3145,"あ":-538,"い":505,"う":134,"お":-502,"か":1454,"が":-856,"く":-412,"こ":1141,"さ":878,"ざ":540,"し":1529,"す":-675,"せ":300,"そ":-1011,"た":188,"だ":1837,"つ":-949,"て":-291,"で":-268,"と":-981,"ど":1273,"な":1063,"に":-1764,"の":130,"は":-409,"ひ":-1273,"べ":1261,"ま":600,"も":-1263,"や":-402,"よ":1639,"り":-579,"る":-694,"れ":571,"を":-2516,"ん":2095,"ア":-587,"カ":306,"キ":568,"ッ":831,"三":-758,"不":-2150,"世":-302,"中":-968,"主":-861,"事":492,"人":-123,"会":978,"保":362,"入":548,"初":-3025,"副":-1566,"北":-3414,"区":-422,"大":-1769,"天":-865,"太":-483,"子":-1519,"学":760,"実":1023,"小":-2009,"市":-813,"年":-1060,"強":1067,"手":-1519,"揺":-1033,"政":1522,"文":-1355,"新":-1682,"日":-1815,"明":-1462,"最":-630,"朝":-1843,"本":-1650,"東":-931,"果":-665,"次":-2378,"民":-180,"気":-1740,"理":752,"発":529,"目":-1584,"相":-242,"県":-1165,"立":-763,"第":810,"米":509,"自":-1353,"行":838,"西":-744,"見":-3874,"調":1010,"議":1198,"込":3041,"開":1758,"間":-1257,"「":-645,"」":3145,"ッ":831,"ア":-587,"カ":306,"キ":568};
this.UW3__ = {",":4889,"1":-800,"":-1723,"、":4889,"々":-2311,"":5827,"」":2670,"〓":-3573,"あ":-2696,"い":1006,"う":2342,"え":1983,"お":-4864,"か":-1163,"が":3271,"く":1004,"け":388,"げ":401,"こ":-3552,"ご":-3116,"さ":-1058,"し":-395,"す":584,"せ":3685,"そ":-5228,"た":842,"ち":-521,"っ":-1444,"つ":-1081,"て":6167,"で":2318,"と":1691,"ど":-899,"な":-2788,"に":2745,"の":4056,"は":4555,"ひ":-2171,"ふ":-1798,"へ":1199,"ほ":-5516,"ま":-4384,"み":-120,"め":1205,"も":2323,"や":-788,"よ":-202,"ら":727,"り":649,"る":5905,"れ":2773,"わ":-1207,"を":6620,"ん":-518,"ア":551,"グ":1319,"ス":874,"ッ":-1350,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278,"・":-3794,"一":-1619,"下":-1759,"世":-2087,"両":3815,"中":653,"主":-758,"予":-1193,"二":974,"人":2742,"今":792,"他":1889,"以":-1368,"低":811,"何":4265,"作":-361,"保":-2439,"元":4858,"党":3593,"全":1574,"公":-3030,"六":755,"共":-1880,"円":5807,"再":3095,"分":457,"初":2475,"別":1129,"前":2286,"副":4437,"力":365,"動":-949,"務":-1872,"化":1327,"北":-1038,"区":4646,"千":-2309,"午":-783,"協":-1006,"口":483,"右":1233,"各":3588,"合":-241,"同":3906,"和":-837,"員":4513,"国":642,"型":1389,"場":1219,"外":-241,"妻":2016,"学":-1356,"安":-423,"実":-1008,"家":1078,"小":-513,"少":-3102,"州":1155,"市":3197,"平":-1804,"年":2416,"広":-1030,"府":1605,"度":1452,"建":-2352,"当":-3885,"得":1905,"思":-1291,"性":1822,"戸":-488,"指":-3973,"政":-2013,"教":-1479,"数":3222,"文":-1489,"新":1764,"日":2099,"旧":5792,"昨":-661,"時":-1248,"曜":-951,"最":-937,"月":4125,"期":360,"李":3094,"村":364,"東":-805,"核":5156,"森":2438,"業":484,"氏":2613,"民":-1694,"決":-1073,"法":1868,"海":-495,"無":979,"物":461,"特":-3850,"生":-273,"用":914,"町":1215,"的":7313,"直":-1835,"省":792,"県":6293,"知":-1528,"私":4231,"税":401,"立":-960,"第":1201,"米":7767,"系":3066,"約":3663,"級":1384,"統":-4229,"総":1163,"線":1255,"者":6457,"能":725,"自":-2869,"英":785,"見":1044,"調":-562,"財":-733,"費":1777,"車":1835,"軍":1375,"込":-1504,"通":-1136,"選":-681,"郎":1026,"郡":4404,"部":1200,"金":2163,"長":421,"開":-1432,"間":1302,"関":-1282,"雨":2009,"電":-1045,"非":2066,"駅":1620,"":-800,"」":2670,"・":-3794,"ッ":-1350,"ア":551,"グ":1319,"ス":874,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278};
this.UW4__ = {",":3930,".":3508,"―":-4841,"、":3930,"。":3508,"":4999,"「":1895,"」":3798,"〓":-5156,"あ":4752,"い":-3435,"う":-640,"え":-2514,"お":2405,"か":530,"が":6006,"き":-4482,"ぎ":-3821,"く":-3788,"け":-4376,"げ":-4734,"こ":2255,"ご":1979,"さ":2864,"し":-843,"じ":-2506,"す":-731,"ず":1251,"せ":181,"そ":4091,"た":5034,"だ":5408,"ち":-3654,"っ":-5882,"つ":-1659,"て":3994,"で":7410,"と":4547,"な":5433,"に":6499,"ぬ":1853,"ね":1413,"の":7396,"は":8578,"ば":1940,"ひ":4249,"び":-4134,"ふ":1345,"へ":6665,"べ":-744,"ほ":1464,"ま":1051,"み":-2082,"む":-882,"め":-5046,"も":4169,"ゃ":-2666,"や":2795,"ょ":-1544,"よ":3351,"ら":-2922,"り":-9726,"る":-14896,"れ":-2613,"ろ":-4570,"わ":-1783,"を":13150,"ん":-2352,"カ":2145,"コ":1789,"セ":1287,"ッ":-724,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637,"・":-4371,"ー":-11870,"一":-2069,"中":2210,"予":782,"事":-190,"井":-1768,"人":1036,"以":544,"会":950,"体":-1286,"作":530,"側":4292,"先":601,"党":-2006,"共":-1212,"内":584,"円":788,"初":1347,"前":1623,"副":3879,"力":-302,"動":-740,"務":-2715,"化":776,"区":4517,"協":1013,"参":1555,"合":-1834,"和":-681,"員":-910,"器":-851,"回":1500,"国":-619,"園":-1200,"地":866,"場":-1410,"塁":-2094,"士":-1413,"多":1067,"大":571,"子":-4802,"学":-1397,"定":-1057,"寺":-809,"小":1910,"屋":-1328,"山":-1500,"島":-2056,"川":-2667,"市":2771,"年":374,"庁":-4556,"後":456,"性":553,"感":916,"所":-1566,"支":856,"改":787,"政":2182,"教":704,"文":522,"方":-856,"日":1798,"時":1829,"最":845,"月":-9066,"木":-485,"来":-442,"校":-360,"業":-1043,"氏":5388,"民":-2716,"気":-910,"沢":-939,"済":-543,"物":-735,"率":672,"球":-1267,"生":-1286,"産":-1101,"田":-2900,"町":1826,"的":2586,"目":922,"省":-3485,"県":2997,"空":-867,"立":-2112,"第":788,"米":2937,"系":786,"約":2171,"経":1146,"統":-1169,"総":940,"線":-994,"署":749,"者":2145,"能":-730,"般":-852,"行":-792,"規":792,"警":-1184,"議":-244,"谷":-1000,"賞":730,"車":-1481,"軍":1158,"輪":-1433,"込":-3370,"近":929,"道":-1291,"選":2596,"郎":-4866,"都":1192,"野":-1100,"銀":-2213,"長":357,"間":-2344,"院":-2297,"際":-2604,"電":-878,"領":-1659,"題":-792,"館":-1984,"首":1749,"高":2120,"「":1895,"」":3798,"・":-4371,"ッ":-724,"ー":-11870,"カ":2145,"コ":1789,"セ":1287,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637};
this.UW5__ = {",":465,".":-299,"1":-514,"E2":-32768,"]":-2762,"、":465,"。":-299,"「":363,"あ":1655,"い":331,"う":-503,"え":1199,"お":527,"か":647,"が":-421,"き":1624,"ぎ":1971,"く":312,"げ":-983,"さ":-1537,"し":-1371,"す":-852,"だ":-1186,"ち":1093,"っ":52,"つ":921,"て":-18,"で":-850,"と":-127,"ど":1682,"な":-787,"に":-1224,"の":-635,"は":-578,"べ":1001,"み":502,"め":865,"ゃ":3350,"ょ":854,"り":-208,"る":429,"れ":504,"わ":419,"を":-1264,"ん":327,"イ":241,"ル":451,"ン":-343,"中":-871,"京":722,"会":-1153,"党":-654,"務":3519,"区":-901,"告":848,"員":2104,"大":-1296,"学":-548,"定":1785,"嵐":-1304,"市":-2991,"席":921,"年":1763,"思":872,"所":-814,"挙":1618,"新":-1682,"日":218,"月":-4353,"査":932,"格":1356,"機":-1508,"氏":-1347,"田":240,"町":-3912,"的":-3149,"相":1319,"省":-1052,"県":-4003,"研":-997,"社":-278,"空":-813,"統":1955,"者":-2233,"表":663,"語":-1073,"議":1219,"選":-1018,"郎":-368,"長":786,"間":1191,"題":2368,"館":-689,"":-514,"E2":-32768,"「":363,"イ":241,"ル":451,"ン":-343};
this.UW6__ = {",":227,".":808,"1":-270,"E1":306,"、":227,"。":808,"あ":-307,"う":189,"か":241,"が":-73,"く":-121,"こ":-200,"じ":1782,"す":383,"た":-428,"っ":573,"て":-1014,"で":101,"と":-105,"な":-253,"に":-149,"の":-417,"は":-236,"も":-206,"り":187,"る":-135,"を":195,"ル":-673,"ン":-496,"一":-277,"中":201,"件":-800,"会":624,"前":302,"区":1792,"員":-1212,"委":798,"学":-960,"市":887,"広":-695,"後":535,"業":-697,"相":753,"社":-507,"福":974,"空":-822,"者":1811,"連":463,"郎":1082,"":-270,"E1":306,"ル":-673,"ン":-496};
return this;
}
TinySegmenter.prototype.ctype_ = function(str) {
for (var i in this.chartype_) {
if (str.match(this.chartype_[i][0])) {
return this.chartype_[i][1];
}
}
return "O";
}
TinySegmenter.prototype.ts_ = function(v) {
if (v) { return v; }
return 0;
}
TinySegmenter.prototype.segment = function(input) {
if (input == null || input == undefined || input == "") {
return [];
}
var result = [];
var seg = ["B3","B2","B1"];
var ctype = ["O","O","O"];
var o = input.split("");
for (i = 0; i < o.length; ++i) {
seg.push(o[i]);
ctype.push(this.ctype_(o[i]))
}
seg.push("E1");
seg.push("E2");
seg.push("E3");
ctype.push("O");
ctype.push("O");
ctype.push("O");
var word = seg[3];
var p1 = "U";
var p2 = "U";
var p3 = "U";
for (var i = 4; i < seg.length - 3; ++i) {
var score = this.BIAS__;
var w1 = seg[i-3];
var w2 = seg[i-2];
var w3 = seg[i-1];
var w4 = seg[i];
var w5 = seg[i+1];
var w6 = seg[i+2];
var c1 = ctype[i-3];
var c2 = ctype[i-2];
var c3 = ctype[i-1];
var c4 = ctype[i];
var c5 = ctype[i+1];
var c6 = ctype[i+2];
score += this.ts_(this.UP1__[p1]);
score += this.ts_(this.UP2__[p2]);
score += this.ts_(this.UP3__[p3]);
score += this.ts_(this.BP1__[p1 + p2]);
score += this.ts_(this.BP2__[p2 + p3]);
score += this.ts_(this.UW1__[w1]);
score += this.ts_(this.UW2__[w2]);
score += this.ts_(this.UW3__[w3]);
score += this.ts_(this.UW4__[w4]);
score += this.ts_(this.UW5__[w5]);
score += this.ts_(this.UW6__[w6]);
score += this.ts_(this.BW1__[w2 + w3]);
score += this.ts_(this.BW2__[w3 + w4]);
score += this.ts_(this.BW3__[w4 + w5]);
score += this.ts_(this.TW1__[w1 + w2 + w3]);
score += this.ts_(this.TW2__[w2 + w3 + w4]);
score += this.ts_(this.TW3__[w3 + w4 + w5]);
score += this.ts_(this.TW4__[w4 + w5 + w6]);
score += this.ts_(this.UC1__[c1]);
score += this.ts_(this.UC2__[c2]);
score += this.ts_(this.UC3__[c3]);
score += this.ts_(this.UC4__[c4]);
score += this.ts_(this.UC5__[c5]);
score += this.ts_(this.UC6__[c6]);
score += this.ts_(this.BC1__[c2 + c3]);
score += this.ts_(this.BC2__[c3 + c4]);
score += this.ts_(this.BC3__[c4 + c5]);
score += this.ts_(this.TC1__[c1 + c2 + c3]);
score += this.ts_(this.TC2__[c2 + c3 + c4]);
score += this.ts_(this.TC3__[c3 + c4 + c5]);
score += this.ts_(this.TC4__[c4 + c5 + c6]);
// score += this.ts_(this.TC5__[c4 + c5 + c6]);
score += this.ts_(this.UQ1__[p1 + c1]);
score += this.ts_(this.UQ2__[p2 + c2]);
score += this.ts_(this.UQ3__[p3 + c3]);
score += this.ts_(this.BQ1__[p2 + c2 + c3]);
score += this.ts_(this.BQ2__[p2 + c3 + c4]);
score += this.ts_(this.BQ3__[p3 + c2 + c3]);
score += this.ts_(this.BQ4__[p3 + c3 + c4]);
score += this.ts_(this.TQ1__[p2 + c1 + c2 + c3]);
score += this.ts_(this.TQ2__[p2 + c2 + c3 + c4]);
score += this.ts_(this.TQ3__[p3 + c1 + c2 + c3]);
score += this.ts_(this.TQ4__[p3 + c2 + c3 + c4]);
var p = "O";
if (score > 0) {
result.push(word);
word = "";
p = "B";
}
p1 = p2;
p2 = p3;
p3 = p;
word += seg[i];
}
result.push(word);
return result;
}
lunr.TinySegmenter = TinySegmenter;
};
}));
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
{"version":3,"sources":["src/templates/assets/stylesheets/palette/_scheme.scss","../../../../src/templates/assets/stylesheets/palette.scss","src/templates/assets/stylesheets/palette/_accent.scss","src/templates/assets/stylesheets/palette/_primary.scss","src/templates/assets/stylesheets/utilities/_break.scss"],"names":[],"mappings":"AA2BA,cAGE,6BAME,sDAAA,CACA,6DAAA,CACA,+DAAA,CACA,gEAAA,CACA,mDAAA,CACA,6DAAA,CACA,+DAAA,CACA,gEAAA,CAGA,mDAAA,CACA,gDAAA,CACA,yDAAA,CACA,4DAAA,CAGA,0BAAA,CACA,mCAAA,CAGA,iCAAA,CACA,kCAAA,CACA,mCAAA,CACA,mCAAA,CACA,kCAAA,CACA,iCAAA,CACA,+CAAA,CACA,6DAAA,CACA,gEAAA,CACA,4DAAA,CACA,4DAAA,CACA,6DAAA,CAGA,6CAAA,CAGA,+CAAA,CAGA,uDAAA,CACA,6DAAA,CACA,2DAAA,CAGA,iCAAA,CAGA,yDAAA,CACA,iEAAA,CAGA,mDAAA,CACA,mDAAA,CAGA,qDAAA,CACA,uDAAA,CAGA,8DAAA,CAKA,8DAAA,CAKA,0DAAA,CAzEA,iBCiBF,CD6DE,kHAEE,YC3DJ,CDkFE,yDACE,4BChFJ,CD+EE,2DACE,4BC7EJ,CD4EE,gEACE,4BC1EJ,CDyEE,2DACE,4BCvEJ,CDsEE,yDACE,4BCpEJ,CDmEE,0DACE,4BCjEJ,CDgEE,gEACE,4BC9DJ,CD6DE,0DACE,4BC3DJ,CD0DE,2OACE,4BC/CJ,CDsDA,+FAGE,iCCpDF,CACF,CCjDE,2BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD6CN,CCvDE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDoDN,CC9DE,8BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD2DN,CCrEE,mCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDkEN,CC5EE,8BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDyEN,CCnFE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDgFN,CC1FE,kCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDuFN,CCjGE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD8FN,CCxGE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDqGN,CC/GE,6BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD4GN,CCtHE,mCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDmHN,CC7HE,4BACE,4BAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCD6HN,CCpIE,8BACE,4BAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCDoIN,CC3IE,6BACE,yBAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCD2IN,CClJE,8BACE,4BAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCDkJN,CCzJE,mCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDsJN,CE3JE,4BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwJN,CEnKE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgKN,CE3KE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwKN,CEnLE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgLN,CE3LE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwLN,CEnME,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgMN,CE3ME,mCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwMN,CEnNE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgNN,CE3NE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwNN,CEnOE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgON,CE3OE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwON,CEnPE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCFmPN,CE3PE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCF2PN,CEnQE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCFmQN,CE3QE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCF2QN,CEnRE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgRN,CE3RE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwRN,CEnSE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCAAA,CAKA,4BF4RN,CE5SE,kCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCAAA,CAKA,4BFqSN,CEtRE,sEACE,4BFyRJ,CE1RE,+DACE,4BF6RJ,CE9RE,iEACE,4BFiSJ,CElSE,gEACE,4BFqSJ,CEtSE,iEACE,4BFySJ,CEhSA,8BACE,mDAAA,CACA,4DAAA,CACA,0DAAA,CACA,oDAAA,CACA,2DAAA,CAGA,4BFiSF,CE9RE,yCACE,+BFgSJ,CE7RI,kDAEE,0CAAA,CACA,sCAAA,CAFA,mCFiSN,CG7MI,mCD1EA,+CACE,8CF0RJ,CEvRI,qDACE,8CFyRN,CEpRE,iEACE,mCFsRJ,CACF,CGxNI,sCDvDA,uCACE,oCFkRJ,CACF,CEzQA,8BACE,kDAAA,CACA,4DAAA,CACA,wDAAA,CACA,oDAAA,CACA,6DAAA,CAGA,4BF0QF,CEvQE,yCACE,+BFyQJ,CEtQI,kDAEE,0CAAA,CACA,sCAAA,CAFA,mCF0QN,CEnQE,yCACE,6CFqQJ,CG9NI,0CDhCA,8CACE,gDFiQJ,CACF,CGnOI,0CDvBA,iFACE,6CF6PJ,CACF,CG3PI,sCDKA,uCACE,6CFyPJ,CACF","file":"palette.css"}
+23
View File
@@ -0,0 +1,23 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
+31
View File
@@ -0,0 +1,31 @@
# -*- coding:utf-8 -*
#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from django.contrib import admin
from club.models import Club, Membership
admin.site.register(Club)
admin.site.register(Membership)
+98
View File
@@ -0,0 +1,98 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
import django.core.validators
class Migration(migrations.Migration):
dependencies = []
operations = [
migrations.CreateModel(
name="Club",
fields=[
(
"id",
models.AutoField(
primary_key=True,
serialize=False,
verbose_name="ID",
auto_created=True,
),
),
("name", models.CharField(max_length=64, verbose_name="name")),
(
"unix_name",
models.CharField(
unique=True,
max_length=30,
error_messages={
"unique": "A club with that unix name already exists."
},
verbose_name="unix name",
validators=[
django.core.validators.RegexValidator(
"^[a-z0-9][a-z0-9._-]*[a-z0-9]$",
"Enter a valid unix name. This value may contain only letters, numbers ./-/_ characters.",
)
],
),
),
("address", models.CharField(max_length=254, verbose_name="address")),
],
),
migrations.CreateModel(
name="Membership",
fields=[
(
"id",
models.AutoField(
primary_key=True,
serialize=False,
verbose_name="ID",
auto_created=True,
),
),
(
"start_date",
models.DateField(verbose_name="start date", auto_now=True),
),
(
"end_date",
models.DateField(null=True, verbose_name="end date", blank=True),
),
(
"role",
models.IntegerField(
choices=[
(0, "Curious"),
(1, "Active member"),
(2, "Board member"),
(3, "IT supervisor"),
(4, "Secretary"),
(5, "Communication supervisor"),
(7, "Treasurer"),
(9, "Vice-President"),
(10, "President"),
],
default=0,
verbose_name="role",
),
),
(
"description",
models.CharField(
max_length=128, blank=True, verbose_name="description"
),
),
(
"club",
models.ForeignKey(
verbose_name="club", to="club.Club", related_name="members"
),
),
],
),
]
@@ -0,0 +1,65 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("club", "0001_initial"),
("core", "0001_initial"),
]
operations = [
migrations.AddField(
model_name="membership",
name="user",
field=models.ForeignKey(
verbose_name="user",
to=settings.AUTH_USER_MODEL,
related_name="membership",
),
),
migrations.AddField(
model_name="club",
name="edit_groups",
field=models.ManyToManyField(
to="core.Group", blank=True, related_name="editable_club"
),
),
migrations.AddField(
model_name="club",
name="home",
field=models.OneToOneField(
blank=True,
null=True,
related_name="home_of_club",
verbose_name="home",
to="core.SithFile",
),
),
migrations.AddField(
model_name="club",
name="owner_group",
field=models.ForeignKey(
default=1, to="core.Group", related_name="owned_club"
),
),
migrations.AddField(
model_name="club",
name="parent",
field=models.ForeignKey(
null=True, to="club.Club", related_name="children", blank=True
),
),
migrations.AddField(
model_name="club",
name="view_groups",
field=models.ManyToManyField(
to="core.Group", blank=True, related_name="viewable_club"
),
),
]
@@ -0,0 +1,17 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [("club", "0002_auto_20160824_2152")]
operations = [
migrations.AlterField(
model_name="membership",
name="start_date",
field=models.DateField(verbose_name="start date"),
)
]
@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
class Migration(migrations.Migration):
dependencies = [("club", "0003_auto_20160902_2042")]
operations = [
migrations.AlterField(
model_name="membership",
name="user",
field=models.ForeignKey(
verbose_name="user",
related_name="memberships",
to=settings.AUTH_USER_MODEL,
),
)
]
@@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [("club", "0004_auto_20160915_1057")]
operations = [
migrations.AlterField(
model_name="club",
name="home",
field=models.OneToOneField(
related_name="home_of_club",
blank=True,
on_delete=django.db.models.deletion.SET_NULL,
verbose_name="home",
null=True,
to="core.SithFile",
),
)
]
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [("club", "0005_auto_20161120_1149")]
operations = [
migrations.AlterField(
model_name="membership",
name="start_date",
field=models.DateField(
verbose_name="start date", default=django.utils.timezone.now
),
)
]
@@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [("club", "0006_auto_20161229_0040")]
operations = [
migrations.AlterModelOptions(
name="club", options={"ordering": ["name", "unix_name"]}
)
]

Some files were not shown because too many files have changed in this diff Show More