Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Sith
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
59
Issues
59
List
Boards
Labels
Service Desk
Milestones
Merge Requests
9
Merge Requests
9
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
AE
Sith
Commits
593050d9
Commit
593050d9
authored
Jul 18, 2016
by
Skia
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Improve greatly the counter right management
parent
e92a73df
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
180 additions
and
63 deletions
+180
-63
core/management/commands/populate.py
core/management/commands/populate.py
+42
-22
core/migrations/0005_auto_20160717_1459.py
core/migrations/0005_auto_20160717_1459.py
+26
-0
core/migrations/0006_auto_20160717_1506.py
core/migrations/0006_auto_20160717_1506.py
+31
-0
core/migrations/0007_user_is_superuser.py
core/migrations/0007_user_is_superuser.py
+19
-0
core/models.py
core/models.py
+9
-16
core/templates/core/user_base.jinja
core/templates/core/user_base.jinja
+1
-1
core/templates/core/user_group.jinja
core/templates/core/user_group.jinja
+0
-0
core/templates/core/user_tools.jinja
core/templates/core/user_tools.jinja
+14
-1
core/urls.py
core/urls.py
+1
-1
core/views/forms.py
core/views/forms.py
+2
-11
core/views/user.py
core/views/user.py
+6
-3
counter/models.py
counter/models.py
+4
-1
counter/templates/counter/counter_list.jinja
counter/templates/counter/counter_list.jinja
+1
-2
sith/settings_sample.py
sith/settings_sample.py
+24
-5
No files found.
core/management/commands/populate.py
View file @
593050d9
...
...
@@ -20,25 +20,38 @@ class Command(BaseCommand):
def
add_arguments
(
self
,
parser
):
parser
.
add_argument
(
'--prod'
,
action
=
"store_true"
)
def
reset_index
(
self
,
*
args
):
sqlcmd
=
StringIO
()
call_command
(
"sqlsequencereset"
,
*
args
,
stdout
=
sqlcmd
)
cursor
=
connection
.
cursor
()
cursor
.
execute
(
sqlcmd
.
getvalue
())
def
handle
(
self
,
*
args
,
**
options
):
os
.
environ
[
'DJANGO_COLORS'
]
=
'nocolor'
root_path
=
os
.
path
.
dirname
(
os
.
path
.
dirname
(
os
.
path
.
dirname
(
os
.
path
.
dirname
(
__file__
))))
for
g
in
settings
.
SITH_GROUPS
.
values
():
Group
(
id
=
g
[
'id'
],
name
=
g
[
'name'
]).
save
()
sqlcmd
=
StringIO
()
call_command
(
"sqlsequencereset"
,
"core"
,
"auth"
,
stdout
=
sqlcmd
)
cursor
=
connection
.
cursor
()
print
(
sqlcmd
.
getvalue
())
cursor
.
execute
(
sqlcmd
.
getvalue
())
self
.
reset_index
(
"core"
,
"auth"
)
root
=
User
(
username
=
'root'
,
last_name
=
""
,
first_name
=
"Bibou"
,
email
=
"ae.info@utbm.fr"
,
date_of_birth
=
"1942-06-12"
,
is_superuser
=
True
,
is_staff
=
True
)
root
.
set_password
(
"plop"
)
root
.
save
()
ae
=
Club
(
name
=
settings
.
SITH_MAIN_CLUB
[
'name'
],
unix_name
=
settings
.
SITH_MAIN_CLUB
[
'unix_name'
],
main_club
=
Club
(
name
=
settings
.
SITH_MAIN_CLUB
[
'name'
],
unix_name
=
settings
.
SITH_MAIN_CLUB
[
'unix_name'
],
address
=
settings
.
SITH_MAIN_CLUB
[
'address'
])
ae
.
save
()
main_club
.
save
()
bar_club
=
Club
(
name
=
settings
.
SITH_BAR_MANAGER
[
'name'
],
unix_name
=
settings
.
SITH_BAR_MANAGER
[
'unix_name'
],
address
=
settings
.
SITH_BAR_MANAGER
[
'address'
])
bar_club
.
save
()
for
b
in
settings
.
SITH_COUNTER_BARS
:
g
=
Group
(
name
=
b
[
1
]
+
" admin"
)
g
.
save
()
c
=
Counter
(
id
=
b
[
0
],
name
=
b
[
1
],
club
=
bar_club
,
type
=
'BAR'
)
c
.
save
()
c
.
edit_groups
=
[
g
]
c
.
save
()
self
.
reset_index
(
"counter"
)
p
=
Page
(
name
=
'Index'
)
p
.
set_lock
(
root
)
p
.
save
()
...
...
@@ -77,6 +90,16 @@ Welcome to the wiki page!
subscriber
.
save
()
subscriber
.
view_groups
=
[
Group
.
objects
.
filter
(
name
=
settings
.
SITH_MAIN_MEMBERS_GROUP
).
first
().
id
]
subscriber
.
save
()
# Adding user Counter admin
counter
=
User
(
username
=
'counter'
,
last_name
=
"Ter"
,
first_name
=
"Coun"
,
email
=
"counter@git.an"
,
date_of_birth
=
"1942-06-12"
,
is_superuser
=
False
,
is_staff
=
False
)
counter
.
set_password
(
"plop"
)
counter
.
save
()
counter
.
view_groups
=
[
Group
.
objects
.
filter
(
name
=
settings
.
SITH_MAIN_MEMBERS_GROUP
).
first
().
id
]
counter
.
groups
=
[
Group
.
objects
.
filter
(
name
=
settings
.
SITH_GROUPS
[
'counter-admin'
][
'name'
]).
first
().
id
]
counter
.
save
()
# Adding user Comptable
comptable
=
User
(
username
=
'comptable'
,
last_name
=
"Able"
,
first_name
=
"Compte"
,
email
=
"compta@git.an"
,
...
...
@@ -155,17 +178,15 @@ Cette page vise à documenter la syntaxe *Markdown* utilisée sur le site.
# Clubs
Club
(
name
=
"Bibo'UT"
,
unix_name
=
"bibout"
,
address
=
"46 de la Boustifaille"
,
parent
=
ae
).
save
()
address
=
"46 de la Boustifaille"
,
parent
=
main_club
).
save
()
guyut
=
Club
(
name
=
"Guy'UT"
,
unix_name
=
"guyut"
,
address
=
"42 de la Boustifaille"
,
parent
=
ae
)
address
=
"42 de la Boustifaille"
,
parent
=
main_club
)
guyut
.
save
()
Club
(
name
=
"Woenzel'UT"
,
unix_name
=
"woenzel"
,
address
=
"Woenzel"
,
parent
=
guyut
).
save
()
Club
(
name
=
"BdF"
,
unix_name
=
"bdf"
,
address
=
"6 Bd Anatole France"
).
save
()
Membership
(
user
=
skia
,
club
=
ae
,
role
=
3
,
description
=
""
).
save
()
Membership
(
user
=
skia
,
club
=
main_club
,
role
=
3
,
description
=
""
).
save
()
troll
=
Club
(
name
=
"Troll Penché"
,
unix_name
=
"troll"
,
address
=
"Terre Du Milieu"
,
parent
=
ae
)
address
=
"Terre Du Milieu"
,
parent
=
main_club
)
troll
.
save
()
# Counters
...
...
@@ -174,25 +195,24 @@ Cette page vise à documenter la syntaxe *Markdown* utilisée sur le site.
p
=
ProductType
(
name
=
"Bières bouteilles"
)
p
.
save
()
barb
=
Product
(
name
=
"Barbar"
,
code
=
"BARB"
,
product_type
=
p
,
purchase_price
=
"1.50"
,
selling_price
=
"1.7"
,
special_selling_price
=
"1.6"
,
club
=
ae
)
special_selling_price
=
"1.6"
,
club
=
main_club
)
barb
.
save
()
cble
=
Product
(
name
=
"Chimay Bleue"
,
code
=
"CBLE"
,
product_type
=
p
,
purchase_price
=
"1.50"
,
selling_price
=
"1.7"
,
special_selling_price
=
"1.6"
,
club
=
ae
)
special_selling_price
=
"1.6"
,
club
=
main_club
)
cble
.
save
()
Product
(
name
=
"Corsendonk"
,
code
=
"CORS"
,
product_type
=
p
,
purchase_price
=
"1.50"
,
selling_price
=
"1.7"
,
special_selling_price
=
"1.6"
,
club
=
ae
).
save
()
special_selling_price
=
"1.6"
,
club
=
main_club
).
save
()
Product
(
name
=
"Carolus"
,
code
=
"CARO"
,
product_type
=
p
,
purchase_price
=
"1.50"
,
selling_price
=
"1.7"
,
special_selling_price
=
"1.6"
,
club
=
ae
).
save
()
mde
=
Counter
(
name
=
"MDE"
,
club
=
ae
,
type
=
"BAR"
)
mde
.
save
()
special_selling_price
=
"1.6"
,
club
=
main_club
).
save
()
mde
=
Counter
.
objects
.
filter
(
name
=
"MDE"
).
first
()
mde
.
products
.
add
(
barb
)
mde
.
products
.
add
(
cble
)
mde
.
save
()
# Accounting test values:
BankAccount
(
name
=
"AE TG"
,
club
=
ae
).
save
()
BankAccount
(
name
=
"Carte AE"
,
club
=
ae
).
save
()
ba
=
BankAccount
(
name
=
"AE TI"
,
club
=
ae
)
BankAccount
(
name
=
"AE TG"
,
club
=
main_club
).
save
()
BankAccount
(
name
=
"Carte AE"
,
club
=
main_club
).
save
()
ba
=
BankAccount
(
name
=
"AE TI"
,
club
=
main_club
)
ba
.
save
()
ca
=
ClubAccount
(
name
=
"Troll Penché"
,
bank_account
=
ba
,
club
=
troll
)
ca
.
save
()
...
...
core/migrations/0005_auto_20160717_1459.py
0 → 100644
View file @
593050d9
# -*- coding: utf-8 -*-
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'core'
,
'0004_preferences'
),
]
operations
=
[
migrations
.
RemoveField
(
model_name
=
'user'
,
name
=
'edit_groups'
,
),
migrations
.
RemoveField
(
model_name
=
'user'
,
name
=
'owner_group'
,
),
migrations
.
RemoveField
(
model_name
=
'user'
,
name
=
'view_groups'
,
),
]
core/migrations/0006_auto_20160717_1506.py
0 → 100644
View file @
593050d9
# -*- coding: utf-8 -*-
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'core'
,
'0005_auto_20160717_1459'
),
]
operations
=
[
migrations
.
AlterModelOptions
(
name
=
'user'
,
options
=
{},
),
migrations
.
RemoveField
(
model_name
=
'user'
,
name
=
'is_superuser'
,
),
migrations
.
RemoveField
(
model_name
=
'user'
,
name
=
'user_permissions'
,
),
migrations
.
AlterField
(
model_name
=
'user'
,
name
=
'groups'
,
field
=
models
.
ManyToManyField
(
blank
=
True
,
to
=
'core.RealGroup'
,
related_name
=
'users'
),
),
]
core/migrations/0007_user_is_superuser.py
0 → 100644
View file @
593050d9
# -*- coding: utf-8 -*-
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'core'
,
'0006_auto_20160717_1506'
),
]
operations
=
[
migrations
.
AddField
(
model_name
=
'user'
,
name
=
'is_superuser'
,
field
=
models
.
BooleanField
(
help_text
=
'Designates whether this user is a superuser. '
,
default
=
False
,
verbose_name
=
'superuser'
),
),
]
core/models.py
View file @
593050d9
...
...
@@ -45,7 +45,7 @@ class RealGroup(Group):
class
Meta
:
proxy
=
True
class
User
(
AbstractBaseUser
,
PermissionsMixin
):
class
User
(
AbstractBaseUser
):
"""
Defines the base user class, useable in every app
...
...
@@ -91,27 +91,20 @@ class User(AbstractBaseUser, PermissionsMixin):
),
)
date_joined
=
models
.
DateField
(
_
(
'date joined'
),
auto_now_add
=
True
)
owner_group
=
models
.
ForeignKey
(
Group
,
related_name
=
"owned_user"
,
default
=
settings
.
SITH_GROUPS
[
'root'
][
'id'
])
edit_groups
=
models
.
ManyToManyField
(
Group
,
related_name
=
"editable_user"
,
blank
=
True
)
view_groups
=
models
.
ManyToManyField
(
Group
,
related_name
=
"viewable_user"
,
blank
=
True
)
is_superuser
=
models
.
BooleanField
(
_
(
'superuser'
),
default
=
False
,
help_text
=
_
(
'Designates whether this user is a superuser. '
),
)
groups
=
models
.
ManyToManyField
(
RealGroup
,
related_name
=
'users'
,
blank
=
True
)
objects
=
UserManager
()
USERNAME_FIELD
=
'username'
# REQUIRED_FIELDS = ['email']
class
Meta
:
verbose_name
=
_
(
'user'
)
verbose_name_plural
=
_
(
'users'
)
# Add permissions like this to allow automatic permission validation in is_owner&co
# model: change_prop_<class_name>
# view_<class_name>
permissions
=
(
(
"change_prop_user"
,
"Can change the user's properties (groups, ...)"
),
(
"view_user"
,
"Can view user's profile"
),
)
def
get_absolute_url
(
self
):
"""
This is needed for black magic powered UpdateView's children
...
...
core/templates/core/user_base.jinja
View file @
593050d9
...
...
@@ -8,7 +8,7 @@
<a
href=
"
{{
url
(
'core:user_edit'
,
user_id
=
profile.id
)
}}
"
>
Edit
</a>
{%
endif
%}
{%
if
can_edit_prop
(
profile
,
request.user
)
%}
<a
href=
"
{{
url
(
'core:user_
prop'
,
user_id
=
profile.id
)
}}
"
>
Pro
ps
</a>
<a
href=
"
{{
url
(
'core:user_
groups'
,
user_id
=
profile.id
)
}}
"
>
Grou
ps
</a>
{%
endif
%}
{%
if
(
profile
==
request.user
or
request.user.is_in_group
(
settings.SITH_GROUPS
[
'accounting-admin'
][
'name'
])
...
...
core/templates/core/user_
pro
p.jinja
→
core/templates/core/user_
grou
p.jinja
View file @
593050d9
File moved
core/templates/core/user_tools.jinja
View file @
593050d9
...
...
@@ -12,14 +12,27 @@
{%
if
user.is_in_group
(
settings.SITH_GROUPS
[
'root'
][
'name'
])
%}
<li><a
href=
"
{{
url
(
'core:group_list'
)
}}
"
>
Groups
</a></li>
{%
endif
%}
{%
if
user.is_in_group
(
settings.SITH_GROUPS
[
'counter-admin'
][
'name'
])
%}
<li><a
href=
"
{{
url
(
'counter:admin_list'
)
}}
"
>
Counters management
</a></li>
{%
endif
%}
{%
if
user.is_in_group
(
settings.SITH_GROUPS
[
'accounting-admin'
][
'name'
])
%}
<li><a
href=
"
{{
url
(
'accounting:bank_list'
)
}}
"
>
Accounting
</a></li>
{%
endif
%}
{%
if
user.is_in_group
(
settings.SITH_MAIN_BOARD_GROUP
)
or
user.is_in_group
(
settings.SITH_GROUPS
[
'root'
][
'name'
])
%}
<li><a
href=
"
{{
url
(
'subscription:subscription'
)
}}
"
>
Subscriptions
</a></li>
<li><a
href=
"
{{
url
(
'counter:admin_list'
)
}}
"
>
Counters management
</a></li>
{%
endif
%}
</ul>
<h4>
Counters
</h4>
<ul>
{%
for
b
in
settings.SITH_COUNTER_BARS
%}
{%
if
user.is_in_group
(
b
[
1
]
+
" admin"
)
%}
<li><a
href=
"
{{
url
(
'counter:details'
,
counter_id
=
b
[
0
])
}}
"
>
{{
b
[
1
]
}}
</a>
-
<a
href=
"
{{
url
(
'counter:admin'
,
counter_id
=
b
[
0
])
}}
"
>
Edit
</a></li>
{%
endif
%}
{%
endfor
%}
</ul>
<h4>
Clubs
</h4>
<ul>
{%
for
m
in
user.membership.
filter
(
end_date
=
None
)
.
all
()
%}
...
...
core/urls.py
View file @
593050d9
...
...
@@ -27,7 +27,7 @@ urlpatterns = [
url
(
r
'^user/$'
,
UserListView
.
as_view
(),
name
=
'user_list'
),
url
(
r
'^user/(?P<user_id>[0-9]+)/$'
,
UserView
.
as_view
(),
name
=
'user_profile'
),
url
(
r
'^user/(?P<user_id>[0-9]+)/edit$'
,
UserUpdateProfileView
.
as_view
(),
name
=
'user_edit'
),
url
(
r
'^user/(?P<user_id>[0-9]+)/
prop$'
,
UserUpdatePropView
.
as_view
(),
name
=
'user_prop
'
),
url
(
r
'^user/(?P<user_id>[0-9]+)/
groups$'
,
UserUpdateGroupView
.
as_view
(),
name
=
'user_groups
'
),
url
(
r
'^user/tools/$'
,
UserToolsView
.
as_view
(),
name
=
'user_tools'
),
url
(
r
'^user/(?P<user_id>[0-9]+)/account$'
,
UserAccountView
.
as_view
(),
name
=
'user_account'
),
...
...
core/views/forms.py
View file @
593050d9
...
...
@@ -11,7 +11,7 @@ class RegisteringForm(UserCreationForm):
required_css_class
=
'required'
class
Meta
:
model
=
User
fields
=
(
'first_name'
,
'last_name'
,
'email'
,
'date_of_birth'
)
fields
=
(
'first_name'
,
'last_name'
,
'email'
)
def
save
(
self
,
commit
=
True
):
user
=
super
(
RegisteringForm
,
self
).
save
(
commit
=
False
)
...
...
@@ -27,21 +27,12 @@ class UserPropForm(forms.ModelForm):
required_css_class
=
'required'
class
Meta
:
model
=
User
fields
=
[
'groups'
,
'edit_groups'
,
'view_groups'
]
labels
=
{
'edit_groups'
:
"Edit profile group"
,
'view_groups'
:
"View profile group"
,
}
fields
=
[
'groups'
]
help_texts
=
{
'edit_groups'
:
"Groups that can edit this user's profile"
,
'view_groups'
:
"Groups that can view this user's profile"
,
'groups'
:
"Which groups this user belongs to"
,
}
widgets
=
{
'groups'
:
CheckboxSelectMultiple
,
'user_permissions'
:
CheckboxSelectMultiple
,
'edit_groups'
:
CheckboxSelectMultiple
,
'view_groups'
:
CheckboxSelectMultiple
,
}
class
PagePropForm
(
forms
.
ModelForm
):
...
...
core/views/user.py
View file @
593050d9
...
...
@@ -5,6 +5,8 @@ from django.core.urlresolvers import reverse
from
django.core.exceptions
import
PermissionDenied
,
ObjectDoesNotExist
from
django.views.generic.edit
import
UpdateView
from
django.views.generic
import
ListView
,
DetailView
,
TemplateView
from
django.forms.models
import
modelform_factory
from
django.forms
import
CheckboxSelectMultiple
import
logging
from
core.views
import
CanViewMixin
,
CanEditMixin
,
CanEditPropMixin
...
...
@@ -114,14 +116,15 @@ class UserUpdateProfileView(CanEditMixin, UpdateView):
template_name
=
"core/user_edit.jinja"
fields
=
(
'first_name'
,
'last_name'
,
'nick_name'
,
'email'
,
'date_of_birth'
,
)
class
UserUpdate
Pro
pView
(
CanEditPropMixin
,
UpdateView
):
class
UserUpdate
Grou
pView
(
CanEditPropMixin
,
UpdateView
):
"""
Edit a user's groups
"""
model
=
User
pk_url_kwarg
=
"user_id"
template_name
=
"core/user_prop.jinja"
form_class
=
UserPropForm
template_name
=
"core/user_group.jinja"
form_class
=
modelform_factory
(
User
,
fields
=
[
'groups'
],
widgets
=
{
'groups'
:
CheckboxSelectMultiple
})
context_object_name
=
"profile"
class
UserToolsView
(
TemplateView
):
...
...
counter/models.py
View file @
593050d9
...
...
@@ -85,7 +85,7 @@ class Counter(models.Model):
def
__getattribute__
(
self
,
name
):
if
name
==
"owner_group"
:
return
Group
(
name
=
self
.
club
.
unix_name
+
settings
.
SITH_BOARD_SUFFIX
)
return
Group
.
objects
.
filter
(
name
=
self
.
club
.
unix_name
+
settings
.
SITH_BOARD_SUFFIX
).
first
(
)
return
object
.
__getattribute__
(
self
,
name
)
def
__str__
(
self
):
...
...
@@ -94,6 +94,9 @@ class Counter(models.Model):
def
get_absolute_url
(
self
):
return
reverse
(
'counter:details'
,
kwargs
=
{
'counter_id'
:
self
.
id
})
def
can_be_edited_by
(
self
,
user
):
return
user
.
is_in_group
(
settings
.
SITH_GROUPS
[
'counter-admin'
][
'name'
])
def
can_be_viewed_by
(
self
,
user
):
return
user
.
is_in_group
(
settings
.
SITH_MAIN_BOARD_GROUP
)
...
...
counter/templates/counter/counter_list.jinja
View file @
593050d9
...
...
@@ -11,8 +11,7 @@
<ul>
{%
for
c
in
counter_list
%}
<li><a
href=
"
{{
url
(
'counter:details'
,
counter_id
=
c.id
)
}}
"
>
{{
c
}}
</a>
-
<a
href=
"
{{
url
(
'counter:admin'
,
counter_id
=
c.id
)
}}
"
>
Edit
</a>
-
<a
href=
"
{{
url
(
'counter:delete'
,
counter_id
=
c.id
)
}}
"
>
Delete
</a></li>
<a
href=
"
{{
url
(
'counter:admin'
,
counter_id
=
c.id
)
}}
"
>
Edit
</a></li>
{%
endfor
%}
</ul>
{%
else
%}
...
...
sith/settings_sample.py
View file @
593050d9
...
...
@@ -180,21 +180,34 @@ SITH_MAIN_CLUB = {
'unix_name'
:
"ae"
,
'address'
:
"6 Boulevard Anatole France, 90000 Belfort"
}
# Bar managers
SITH_BAR_MANAGER
=
{
'name'
:
"BdF"
,
'unix_name'
:
"bdf"
,
'address'
:
"6 Boulevard Anatole France, 90000 Belfort"
}
# Define the date in the year serving as reference for the subscriptions calendar
# (month, day)
SITH_START_DATE
=
(
8
,
15
)
# 15th August
SITH_GROUPS
=
{
'root'
:
{
'id'
:
1
,
'name'
:
"
r
oot"
,
'name'
:
"
R
oot"
,
},
'
accounting-admin
'
:
{
'
public
'
:
{
'id'
:
2
,
'name'
:
"
accounting-admin
"
,
'name'
:
"
Not registered users
"
,
},
'
public
'
:
{
'
accounting-admin
'
:
{
'id'
:
3
,
'name'
:
"not-registered-users"
,
'name'
:
"Accounting admin"
,
},
'counter-admin'
:
{
'id'
:
4
,
'name'
:
"Counter admin"
,
},
}
...
...
@@ -217,6 +230,12 @@ SITH_SUBSCRIPTION_PAYMENT_METHOD = [
(
'other'
,
'Autre'
),
]
SITH_COUNTER_BARS
=
[
(
1
,
"Foyer"
),
(
2
,
"MDE"
),
(
3
,
"La Gommette"
),
]
SITH_COUNTER_PAYMENT_METHOD
=
[
(
'cheque'
,
'Chèque'
),
(
'cash'
,
'Espèce'
),
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment