Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
AE UTBM
Sith
Commits
a01fc63a
Commit
a01fc63a
authored
Jul 28, 2016
by
Skia
🤘
Browse files
Begin launderette
parent
4c628168
Pipeline
#77
failed with stage
in 1 minute and 54 seconds
Changes
31
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
core/management/commands/populate.py
View file @
a01fc63a
...
...
@@ -52,6 +52,7 @@ class Command(BaseCommand):
c
.
edit_groups
=
[
g
]
c
.
save
()
self
.
reset_index
(
"counter"
)
Counter
(
name
=
"Eboutic"
,
club
=
main_club
,
type
=
'EBOUTIC'
).
save
()
p
=
Page
(
name
=
'Index'
)
p
.
set_lock
(
root
)
p
.
save
()
...
...
@@ -132,6 +133,18 @@ Welcome to the wiki page!
p
.
save
()
PageRev
(
page
=
p
,
title
=
"Aide sur la syntaxe"
,
author
=
skia
,
content
=
"""
Cette page vise à documenter la syntaxe *Markdown* utilisée sur le site.
"""
).
save
()
p
=
Page
(
name
=
'Services'
)
p
.
save
()
p
.
set_lock
(
skia
)
p
.
view_groups
=
[
settings
.
SITH_GROUPS
[
'public'
][
'id'
]]
p
.
save
()
PageRev
(
page
=
p
,
title
=
"Services"
,
author
=
skia
,
content
=
"""
| | | |
| :---: | :---: | :---: |
| [Eboutic](/eboutic) | [Laverie](/launderette) | Matmat |
| SAS | Weekmail | Forum|
"""
).
save
()
# Adding README
p
=
Page
(
name
=
'README'
)
...
...
core/models.py
View file @
a01fc63a
...
...
@@ -447,7 +447,7 @@ class Page(models.Model):
return
'/'
.
join
([
self
.
parent
.
get_full_name
(),
self
.
name
])
def
get_display_name
(
self
):
return
self
.
get_full_name
()
return
self
.
revisions
.
last
().
title
class
PageRev
(
models
.
Model
):
"""
...
...
core/static/core/style.css
View file @
a01fc63a
...
...
@@ -166,6 +166,11 @@ tbody>tr:hover {
padding
:
4px
;
line-height
:
120%
;
}
textarea
{
white-space
:
pre
;
width
:
98%
;
margin-top
:
10px
;
}
/*--------------------------------FOOTER-------------------------------*/
footer
{
...
...
core/templates/core/login.jinja
View file @
a01fc63a
...
...
@@ -17,19 +17,9 @@
<form
method=
"post"
action=
"
{{
url
(
'core:login'
)
}}
"
>
{%
csrf_token
%}
<table>
<tr>
<td>
{{
form.username.label_tag
()
}}
</td>
<td>
{{
form.username
}}
</td>
</tr>
<tr>
<td>
{{
form.password.label_tag
()
}}
</td>
<td>
{{
form.password
}}
</td>
</tr>
</table>
<input
type=
"submit"
value=
"
{%
trans
%}
login
{%
endtrans
%}
"
/>
<input
type=
"hidden"
name=
"next"
value=
"
{{
next
}}
"
/>
{{
form.as_p
()
}}
<input
type=
"hidden"
name=
"next"
value=
"
{{
next
}}
"
>
<p><input
type=
"submit"
value=
"
{%
trans
%}
login
{%
endtrans
%}
"
></p>
</form>
{# Assumes you setup the password_reset view in your URLconf #}
...
...
core/templates/core/page.jinja
View file @
a01fc63a
...
...
@@ -15,7 +15,7 @@
{%
macro
print_page_name
(
page
)
%}
{%
if
page
%}
{{
print_page_name
(
page.parent
)
}}
>
<a
href=
"
{{
url
(
'core:page'
,
page_name
=
page.get_full_name
())
}}
"
>
{{
page.name
}}
</a>
<a
href=
"
{{
url
(
'core:page'
,
page_name
=
page.get_full_name
())
}}
"
>
{{
page.
get_display_
name
()
}}
</a>
{%
endif
%}
{%
endmacro
%}
...
...
counter/migrations/0010_auto_20160728_1820.py
0 → 100644
View file @
a01fc63a
# -*- coding: utf-8 -*-
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'counter'
,
'0009_auto_20160721_1902'
),
]
operations
=
[
migrations
.
AlterModelOptions
(
name
=
'counter'
,
options
=
{
'verbose_name'
:
'counter'
},
),
migrations
.
AlterModelOptions
(
name
=
'permanency'
,
options
=
{
'verbose_name'
:
'permanency'
},
),
migrations
.
AlterModelOptions
(
name
=
'product'
,
options
=
{
'verbose_name'
:
'product'
},
),
migrations
.
AlterModelOptions
(
name
=
'producttype'
,
options
=
{
'verbose_name'
:
'product type'
},
),
migrations
.
AlterModelOptions
(
name
=
'refilling'
,
options
=
{
'verbose_name'
:
'refilling'
},
),
migrations
.
AlterModelOptions
(
name
=
'selling'
,
options
=
{
'verbose_name'
:
'selling'
},
),
]
launderette/__init__.py
0 → 100644
View file @
a01fc63a
launderette/admin.py
0 → 100644
View file @
a01fc63a
from
django.contrib
import
admin
# Register your models here.
launderette/migrations/0001_initial.py
0 → 100644
View file @
a01fc63a
# -*- coding: utf-8 -*-
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
]
operations
=
[
migrations
.
CreateModel
(
name
=
'Launderette'
,
fields
=
[
(
'id'
,
models
.
AutoField
(
serialize
=
False
,
auto_created
=
True
,
verbose_name
=
'ID'
,
primary_key
=
True
)),
(
'name'
,
models
.
CharField
(
max_length
=
30
,
verbose_name
=
'name'
)),
],
options
=
{
'verbose_name'
:
'Launderette'
,
},
),
migrations
.
CreateModel
(
name
=
'Machine'
,
fields
=
[
(
'id'
,
models
.
AutoField
(
serialize
=
False
,
auto_created
=
True
,
verbose_name
=
'ID'
,
primary_key
=
True
)),
(
'name'
,
models
.
CharField
(
max_length
=
30
,
verbose_name
=
'name'
)),
(
'is_working'
,
models
.
BooleanField
(
default
=
True
,
verbose_name
=
'is working'
)),
(
'launderette'
,
models
.
ForeignKey
(
to
=
'launderette.Launderette'
,
related_name
=
'machines'
,
verbose_name
=
'launderette'
)),
],
options
=
{
'verbose_name'
:
'Machine'
,
},
),
migrations
.
CreateModel
(
name
=
'Token'
,
fields
=
[
(
'id'
,
models
.
AutoField
(
serialize
=
False
,
auto_created
=
True
,
verbose_name
=
'ID'
,
primary_key
=
True
)),
(
'name'
,
models
.
CharField
(
max_length
=
30
,
verbose_name
=
'name'
)),
(
'type'
,
models
.
CharField
(
choices
=
[(
'WASHING'
,
'Washing'
),
(
'DRYING'
,
'Drying'
)],
max_length
=
10
,
verbose_name
=
'type'
)),
(
'launderette'
,
models
.
ForeignKey
(
to
=
'launderette.Launderette'
,
related_name
=
'tokens'
,
verbose_name
=
'launderette'
)),
],
options
=
{
'verbose_name'
:
'Token'
,
},
),
]
launderette/migrations/0002_auto_20160728_1858.py
0 → 100644
View file @
a01fc63a
# -*- coding: utf-8 -*-
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'subscription'
,
'0002_auto_20160718_1805'
),
(
'launderette'
,
'0001_initial'
),
]
operations
=
[
migrations
.
CreateModel
(
name
=
'Slot'
,
fields
=
[
(
'id'
,
models
.
AutoField
(
primary_key
=
True
,
serialize
=
False
,
verbose_name
=
'ID'
,
auto_created
=
True
)),
(
'start_date'
,
models
.
DateTimeField
(
verbose_name
=
'start date'
)),
(
'type'
,
models
.
CharField
(
max_length
=
10
,
verbose_name
=
'type'
,
choices
=
[(
'WASHING'
,
'Washing'
),
(
'DRYING'
,
'Drying'
)])),
(
'machine'
,
models
.
ForeignKey
(
verbose_name
=
'machine'
,
related_name
=
'slots'
,
to
=
'launderette.Machine'
)),
],
),
migrations
.
AlterField
(
model_name
=
'token'
,
name
=
'name'
,
field
=
models
.
IntegerField
(
verbose_name
=
'name'
),
),
migrations
.
AddField
(
model_name
=
'slot'
,
name
=
'token'
,
field
=
models
.
ForeignKey
(
verbose_name
=
'token'
,
related_name
=
'slots'
,
to
=
'launderette.Token'
),
),
migrations
.
AddField
(
model_name
=
'slot'
,
name
=
'user'
,
field
=
models
.
ForeignKey
(
verbose_name
=
'user'
,
related_name
=
'slots'
,
to
=
'subscription.Subscriber'
),
),
]
launderette/migrations/0003_launderette_sellers.py
0 → 100644
View file @
a01fc63a
# -*- coding: utf-8 -*-
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'subscription'
,
'0002_auto_20160718_1805'
),
(
'launderette'
,
'0002_auto_20160728_1858'
),
]
operations
=
[
migrations
.
AddField
(
model_name
=
'launderette'
,
name
=
'sellers'
,
field
=
models
.
ManyToManyField
(
to
=
'subscription.Subscriber'
,
verbose_name
=
'sellers'
,
related_name
=
'launderettes'
),
),
]
launderette/migrations/0004_auto_20160728_1922.py
0 → 100644
View file @
a01fc63a
# -*- coding: utf-8 -*-
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'launderette'
,
'0003_launderette_sellers'
),
]
operations
=
[
migrations
.
AlterField
(
model_name
=
'launderette'
,
name
=
'sellers'
,
field
=
models
.
ManyToManyField
(
blank
=
True
,
to
=
'subscription.Subscriber'
,
verbose_name
=
'sellers'
,
related_name
=
'launderettes'
),
),
]
launderette/migrations/__init__.py
0 → 100644
View file @
a01fc63a
launderette/models.py
0 → 100644
View file @
a01fc63a
from
django.db
import
models
from
django.utils.translation
import
ugettext_lazy
as
_
from
django.conf
import
settings
from
django.core.urlresolvers
import
reverse
from
core.models
import
User
from
subscription.models
import
Subscriber
# Create your models here.
class
Launderette
(
models
.
Model
):
name
=
models
.
CharField
(
_
(
'name'
),
max_length
=
30
)
sellers
=
models
.
ManyToManyField
(
Subscriber
,
verbose_name
=
_
(
'sellers'
),
related_name
=
'launderettes'
,
blank
=
True
)
class
Meta
:
verbose_name
=
_
(
'Launderette'
)
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_GROUPS
[
'launderette-admin'
][
'name'
]):
return
True
return
False
def
can_be_viewed_by
(
self
,
user
):
return
user
.
is_in_group
(
settings
.
SITH_MAIN_MEMBERS_GROUP
)
def
__str__
(
self
):
return
self
.
name
def
get_absolute_url
(
self
):
return
reverse
(
'launderette:launderette_list'
)
class
Machine
(
models
.
Model
):
name
=
models
.
CharField
(
_
(
'name'
),
max_length
=
30
)
launderette
=
models
.
ForeignKey
(
Launderette
,
related_name
=
'machines'
,
verbose_name
=
_
(
'launderette'
))
is_working
=
models
.
BooleanField
(
_
(
'is working'
),
default
=
True
)
class
Meta
:
verbose_name
=
_
(
'Machine'
)
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_GROUPS
[
'launderette-admin'
][
'name'
]):
return
True
return
False
class
Token
(
models
.
Model
):
name
=
models
.
IntegerField
(
_
(
'name'
))
launderette
=
models
.
ForeignKey
(
Launderette
,
related_name
=
'tokens'
,
verbose_name
=
_
(
'launderette'
))
type
=
models
.
CharField
(
_
(
'type'
),
max_length
=
10
,
choices
=
[(
'WASHING'
,
_
(
'Washing'
)),
(
'DRYING'
,
_
(
'Drying'
))])
class
Meta
:
verbose_name
=
_
(
'Token'
)
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_GROUPS
[
'launderette-admin'
][
'name'
]):
return
True
return
False
class
Slot
(
models
.
Model
):
start_date
=
models
.
DateTimeField
(
_
(
'start date'
))
type
=
models
.
CharField
(
_
(
'type'
),
max_length
=
10
,
choices
=
[(
'WASHING'
,
_
(
'Washing'
)),
(
'DRYING'
,
_
(
'Drying'
))])
machine
=
models
.
ForeignKey
(
Machine
,
related_name
=
'slots'
,
verbose_name
=
_
(
'machine'
))
token
=
models
.
ForeignKey
(
Token
,
related_name
=
'slots'
,
verbose_name
=
_
(
'token'
))
user
=
models
.
ForeignKey
(
Subscriber
,
related_name
=
'slots'
,
verbose_name
=
_
(
'user'
))
def
full_clean
(
self
):
return
super
(
Slot
,
self
).
full_clean
()
launderette/templates/launderette/counter_click.jinja
0 → 100644
View file @
a01fc63a
{%
extends
"core/base.jinja"
%}
{%
macro
add_product
(
id
,
content
)
%}
<form
method=
"post"
action=
"
{{
url
(
'counter:click'
,
counter_id
=
counter.id
,
user_id
=
customer.user.id
)
}}
"
class=
"inline"
style=
"display:inline"
>
{%
csrf_token
%}
<input
type=
"hidden"
name=
"action"
value=
"add_product"
>
<button
type=
"submit"
name=
"product_id"
value=
"
{{
id
}}
"
>
{{
content
}}
</button>
</form>
{%
endmacro
%}
{%
macro
del_product
(
id
,
content
)
%}
<form
method=
"post"
action=
"
{{
url
(
'counter:click'
,
counter_id
=
counter.id
,
user_id
=
customer.user.id
)
}}
"
class=
"inline"
style=
"display:inline"
>
{%
csrf_token
%}
<input
type=
"hidden"
name=
"action"
value=
"del_product"
>
<button
type=
"submit"
name=
"product_id"
value=
"
{{
id
}}
"
>
{{
content
}}
</button>
</form>
{%
endmacro
%}
{%
block
content
%}
<h3>
{%
trans
%}
Counter
{%
endtrans
%}
</h3>
<h4>
{{
counter
}}
</h4>
<p><strong>
{%
trans
%}
Club:
{%
endtrans
%}
</strong>
{{
counter.club
}}
</p>
<div>
<h5>
{%
trans
%}
Customer
{%
endtrans
%}
</h5>
<p>
{{
customer.user.get_display_name
()
}}
,
{{
customer.amount
}}
€
</p>
</div>
{%
if
counter.type
==
'BAR'
%}
<div>
<h5>
{%
trans
%}
Refilling
{%
endtrans
%}
</h5>
<form
method=
"post"
action=
"
{{
url
(
'counter:click'
,
counter_id
=
counter.id
,
user_id
=
customer.user.id
)
}}
"
>
{%
csrf_token
%}
{{
refill_form.as_p
()
}}
<input
type=
"hidden"
name=
"action"
value=
"refill"
>
<input
type=
"submit"
value=
"
{%
trans
%}
Go
{%
endtrans
%}
"
/>
</form>
</div>
{%
endif
%}
<div>
<h5>
{%
trans
%}
Selling
{%
endtrans
%}
</h5>
{%
if
request.session
[
'not_enough'
]
%}
<p><strong>
{%
trans
%}
Not enough money
{%
endtrans
%}
</strong></p>
{%
endif
%}
<form
method=
"post"
action=
"
{{
url
(
'counter:click'
,
counter_id
=
counter.id
,
user_id
=
customer.user.id
)
}}
"
>
{%
csrf_token
%}
<input
type=
"hidden"
name=
"action"
value=
"code"
>
<input
type=
"input"
name=
"code"
value=
""
autofocus
/>
<input
type=
"submit"
value=
"
{%
trans
%}
Go
{%
endtrans
%}
"
/>
</form>
<p>
{%
trans
%}
Basket:
{%
endtrans
%}
</p>
<ul>
{%
for
id
,
infos
in
request.session
[
'basket'
]
|
dictsort
%}
{%
set
product
=
counter.products.
filter
(
id
=
id
)
.
first
()
%}
{%
set
s
=
infos
[
'qty'
]
*
infos
[
'price'
]
/
100
%}
<li>
{{
del_product
(
id
,
'-'
)
}}
{{
infos
[
'qty'
]
}}
{{
add_product
(
id
,
'+'
)
}}
{{
product.name
}}
:
{{
"%0.2f"
|
format
(
s
)
}}
€
</li>
{%
endfor
%}
</ul>
<p><strong>
{%
trans
%}
Total:
{%
endtrans
%}{{
"%0.2f"
|
format
(
basket_total
)
}}
€
</strong></p>
<form
method=
"post"
action=
"
{{
url
(
'counter:click'
,
counter_id
=
counter.id
,
user_id
=
customer.user.id
)
}}
"
>
{%
csrf_token
%}
<input
type=
"hidden"
name=
"action"
value=
"finish"
>
<input
type=
"submit"
value=
"
{%
trans
%}
Finish
{%
endtrans
%}
"
/>
</form>
<form
method=
"post"
action=
"
{{
url
(
'counter:click'
,
counter_id
=
counter.id
,
user_id
=
customer.user.id
)
}}
"
>
{%
csrf_token
%}
<input
type=
"hidden"
name=
"action"
value=
"cancel"
>
<input
type=
"submit"
value=
"
{%
trans
%}
Cancel
{%
endtrans
%}
"
/>
</form>
<p><strong>
{%
trans
%}
Products:
{%
endtrans
%}
</strong>
{%
for
p
in
counter.products.all
()
%}
{{
add_product
(
p.id
,
p.name
)
}}
{%
endfor
%}
</p>
</div>
{%
endblock
%}
launderette/templates/launderette/counter_edit.jinja
0 → 100644
View file @
a01fc63a
{%
extends
"core/base.jinja"
%}
{%
block
content
%}
<h2>
{%
trans
%}
Edit counter
{%
endtrans
%}
</h2>
<form
action=
""
method=
"post"
>
{%
csrf_token
%}
{{
form.as_p
()
}}
<p><input
type=
"submit"
value=
"
{%
trans
%}
Save
{%
endtrans
%}
"
/></p>
</form>
{%
endblock
%}
launderette/templates/launderette/counter_main.jinja
0 → 100644
View file @
a01fc63a
{%
extends
"core/base.jinja"
%}
{%
macro
barman_logout_link
(
user
)
%}
<form
method=
"post"
action=
"
{{
url
(
'counter:logout'
,
counter_id
=
counter.id
)
}}
"
class=
"inline"
>
{%
csrf_token
%}
<input
type=
"hidden"
name=
"user_id"
value=
"
{{
user.id
}}
"
>
<button
type=
"submit"
name=
"submit_param"
value=
"submit_value"
class=
"link-button"
>
{{
user.get_display_name
()
}}
</button>
</form>
{%
endmacro
%}
{%
block
content
%}
<h3>
{%
trans
counter_name
=
counter
%}{{
counter_name
}}
counter
{%
endtrans
%}
</h3>
<div>
<h3>
{%
trans
%}
Sellings
{%
endtrans
%}
</h3>
{%
if
last_basket
%}
<h4>
{%
trans
%}
Last selling:
{%
endtrans
%}
</h4>
<p>
{%
trans
%}
Client:
{%
endtrans
%}{{
last_customer
}}
-
{%
trans
%}
New amount:
{%
endtrans
%}{{
new_customer_amount
}}
€.
</p>
<ul>
{%
for
s
in
last_basket
%}
<li>
{{
s
}}
</li>
{%
endfor
%}
</ul>
<p><strong>
{%
trans
%}
Total:
{%
endtrans
%}{{
last_total
}}
€
</strong></p>
{%
endif
%}
{%
if
barmen
%}
<p>
{%
trans
%}
Enter client code:
{%
endtrans
%}
</p>
<form
method=
"post"
action=
"
{{
url
(
'counter:details'
,
counter_id
=
counter.id
)
}}
"
>
{%
csrf_token
%}
{{
form.as_p
()
}}
<p><input
type=
"submit"
value=
"
{%
trans
%}
validate
{%
endtrans
%}
"
/></p>
</form>
{%
else
%}
<p>
{%
trans
%}
Please, login
{%
endtrans
%}
</p>
{%
endif
%}
</div>
{%
if
counter.type
==
'BAR'
%}
<div>
<h3>
{%
trans
%}
Barman:
{%
endtrans
%}
</h3>
<ul>
{%
for
b
in
barmen
%}
<li>
{{
barman_logout_link
(
b
)
}}
</li>
{%
endfor
%}
</ul>
<form
method=
"post"
action=
"
{{
url
(
'counter:login'
,
counter_id
=
counter.id
)
}}
"
>
{%
csrf_token
%}
{{
login_form.as_p
()
}}
<p><input
type=
"submit"
value=
"
{%
trans
%}
login
{%
endtrans
%}
"
/></p>
</form>
</div>
{%
endif
%}
{%
endblock
%}
launderette/templates/launderette/launderette_book.jinja
0 → 100644
View file @
a01fc63a
{%
extends
"core/base.jinja"
%}
{%
block
title
%}
{%
trans
%}
Launderette
{%
endtrans
%}
{%
endblock
%}
{%
block
content
%}
{%
if
request.user.is_in_group
(
settings.SITH_MAIN_MEMBERS_GROUP
)
%}
<ul>
{%
for
l
in
launderette_list
%}
<li><a
href=
"
{{
url
(
'launderette:book_slot'
,
launderette_id
=
l.id
)
}}
"
>
{{
l
}}
</a></li>
{%
endfor
%}
</ul>
{%
endif
%}
{%
endblock
%}
launderette/templates/launderette/launderette_detail.jinja
0 → 100644
View file @
a01fc63a
{%
extends
"core/base.jinja"
%}
{%
block
title
%}
{%
trans
%}
Launderette admin
{%
endtrans
%}
{%
endblock
%}
{%
block
content
%}
Admin
{%
endblock
%}
launderette/templates/launderette/launderette_list.jinja
0 → 100644
View file @
a01fc63a
{%
extends
"core/base.jinja"
%}
{%
block
title
%}
{%
trans
%}
Launderette admin list
{%
endtrans
%}
{%
endblock
%}
{%
block
content
%}
<p><a
href=
"
{{
url
(
'launderette:launderette_new'
)
}}
"
>
{%
trans
%}
New launderette
{%
endtrans
%}
</a></p>
{%
if
launderette_list
%}
<h3>
{%
trans
%}
Launderette admin list
{%
endtrans
%}
</h3>
<ul>
{%
for
l
in
launderette_list
%}
<li><a
href=
"
{{
url
(
'launderette:launderette_details'
,
launderette_id
=
l.id
)
}}
"
>
{{
l
}}
</a>
-
<a
href=
"
{{
url
(
'launderette:launderette_edit'
,
launderette_id
=
l.id
)
}}
"
>
{%
trans
%}
Edit
{%
endtrans
%}
</a></li>
{%
endfor
%}
</ul>
{%
else
%}
{%
trans
%}
There is no launderette in this website.
{%
endtrans
%}
{%
endif
%}
{%
endblock
%}
Prev
1
2
Next
Write
Preview
Supports
Markdown
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