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
La Quadrature du Net
piphone
campaign
Commits
b4c50a97
Commit
b4c50a97
authored
Jun 14, 2017
by
Okhin
Browse files
Fixing the admin for Feedbacks
parent
bdd96c83
Pipeline
#1148
passed with stage
in 48 seconds
Changes
4
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
picampaign/feedback/admin.py
View file @
b4c50a97
from
django.contrib
import
admin
from
django.contrib.contenttypes.models
import
ContentType
from
django.http
import
HttpResponseRedirect
from
picampaign.organization.models
import
FeedbackCategory
from
picampaign.feedback.models
import
Feedback
...
...
@@ -9,10 +11,15 @@ class FeedbackFilterByCategory(admin.SimpleListFilter):
def
lookups
(
self
,
request
,
model_admin
):
if
request
.
user
.
is_superuser
:
feedbacks
=
Feedback
.
objects
.
all
().
values_list
(
'category__id'
,
'category__name'
)
feedbacks
=
Feedback
.
objects
.
all
().
values_list
(
'category__id'
,
'category__name'
)
else
:
user_orgs
=
[
x
.
id
for
x
in
request
.
user
.
organizations
.
all
()]
feedbacks
=
Feedback
.
objects
.
filter
(
category__organisation__in
=
user_orgs
).
values_list
(
'category_id'
,
'category_name'
)
feedbacks
=
Feedback
.
objects
.
filter
(
category__organisation__in
=
user_orgs
).
values_list
(
'category_id'
,
'category_name'
)
return
((
f
[
0
],
f
[
1
],)
for
f
in
sorted
(
set
(
feedbacks
),
key
=
lambda
f
:
f
[
1
]))
...
...
@@ -21,8 +28,65 @@ class FeedbackFilterByCategory(admin.SimpleListFilter):
return
queryset
.
filter
(
category__id
=
self
.
value
())
return
queryset
class
FeedbackFilterByOrganization
(
admin
.
SimpleListFilter
):
title
=
'organization'
parameter_name
=
'organization'
def
lookups
(
self
,
request
,
model_admin
):
if
request
.
user
.
is_superuser
:
feedbacks
=
Feedback
.
objects
.
all
().
values_list
(
'category__organization__id'
,
'category__organization__name'
)
else
:
user_orgs
=
[
x
.
id
for
x
in
request
.
user
.
organizations
.
all
()]
feedbacks
=
Feedback
.
objects
.
filter
(
category__organization__in
=
user_orgs
).
values_list
(
'category__organization__id'
,
'category__organization__name'
)
return
((
f
[
0
],
f
[
1
],)
for
f
in
sorted
(
set
(
feedbacks
),
key
=
lambda
f
:
f
[
1
]))
def
queryset
(
self
,
request
,
queryset
):
if
self
.
value
():
return
queryset
.
filter
(
category__organization__id
=
self
.
value
())
return
queryset
class
FeedbackFilterByCampaign
(
admin
.
SimpleListFilter
):
title
=
'campaign'
parameter_name
=
'campaign'
def
lookups
(
self
,
request
,
model_admin
):
if
request
.
user
.
is_superuser
:
feedbacks
=
Feedback
.
objects
.
all
().
values_list
(
'callee__campaign__id'
,
'callee__campaign__title'
)
else
:
user_orgs
=
[
x
.
id
for
x
in
request
.
user
.
organizations
.
all
()]
feedbacks
=
Feedback
.
objects
.
filter
(
category__organization__in
=
user_orgs
).
values_list
(
'callee__campaign__id'
,
'callee__campaign__title'
)
return
((
f
[
0
],
f
[
1
],)
for
f
in
sorted
(
set
(
feedbacks
),
key
=
lambda
f
:
f
[
1
]))
def
queryset
(
self
,
request
,
queryset
):
if
self
.
value
():
return
queryset
.
filter
(
callee__campaign__id
=
self
.
value
())
return
queryset
class
FeedbackAdmin
(
admin
.
ModelAdmin
):
list_filter
=
(
FeedbackFilterByCategory
,)
date_hierarchy
=
'date'
list_display
=
(
'callee'
,
'category'
,
'date'
,
'organization'
,)
list_filter
=
(
FeedbackFilterByCategory
,
FeedbackFilterByOrganization
,
FeedbackFilterByCampaign
)
search_fields
=
[
'category__organization__name'
,
'category__name'
,
'callee__contact__first_name'
,
'callee__contact__last_name'
,
'callee__campaign__title'
]
actions
=
[
'export_csv'
]
def
get_queryset
(
self
,
request
):
qs
=
super
(
FeedbackAdmin
,
self
).
get_queryset
(
request
)
...
...
@@ -31,4 +95,11 @@ class FeedbackAdmin(admin.ModelAdmin):
user_orgs
=
[
x
.
id
for
x
in
request
.
user
.
organizations
.
all
()]
return
qs
.
filter
(
category__organization__in
=
user_orgs
)
def
export_csv
(
self
,
request
,
queryset
):
selected
=
request
.
POST
.
getlist
(
admin
.
ACTION_CHECKBOX_NAME
)
ct
=
ContentType
.
objects
.
get_for_model
(
queryset
.
model
)
return
HttpResponseRedirect
(
"/export/?ct={}&ids={}"
.
format
(
ct
.
pk
,
","
.
join
(
selected
)))
export_csv
.
short_description
=
"Export feedbacks as CSV"
admin
.
site
.
register
(
Feedback
,
FeedbackAdmin
)
picampaign/feedback/models.py
View file @
b4c50a97
...
...
@@ -11,6 +11,9 @@ class Feedback(models.Model):
comment
=
models
.
CharField
(
max_length
=
512
,
blank
=
True
)
date
=
models
.
DateTimeField
(
auto_now_add
=
True
)
def
organization
(
self
):
return
self
.
category
.
organization
def
__str__
(
self
):
return
_
(
'feedback for %(callee contact)s on %(campaign title)s'
)
%
\
{
'callee contact'
:
self
.
callee
.
contact
,
...
...
picampaign/feedback/views.py
View file @
b4c50a97
import
json
import
csv
from
django.http
import
HttpResponse
from
django.views.decorators.csrf
import
csrf_exempt
from
django.contrib.contenttypes.models
import
ContentType
from
rest_framework
import
viewsets
from
rest_framework.response
import
Response
...
...
@@ -23,3 +26,25 @@ class FeedbackViewSet(viewsets.ViewSet):
return
Response
(
feedback
.
id
)
except
Exception
as
e
:
raise
e
def
FeedbackExportCSVView
(
request
):
response
=
HttpResponse
(
content_type
=
'text/csv'
)
response
[
'Content-Disposition'
]
=
'attachment; filename="feedbacks.csv"'
model
=
ContentType
.
objects
.
get_for_id
(
int
(
request
.
GET
[
'ct'
]))
feedbacks
=
model
.
model_class
().
objects
.
filter
(
pk__in
=
[
int
(
pk
)
for
pk
in
request
.
GET
[
'ids'
].
split
(
','
)]).
select_related
(
'callee'
,
'callee__contact'
,
'callee__campaign'
,
'category'
)
writer
=
csv
.
writer
(
response
)
# A Header is nice
writer
.
writerow
([
'Date'
,
'Contact'
,
'Campaign'
,
'Category'
,
'Comment'
])
for
feedback
in
feedbacks
:
writer
.
writerow
([
feedback
.
date
,
feedback
.
callee
.
contact
.
full_name
,
feedback
.
callee
.
campaign
,
feedback
.
category
,
feedback
.
comment
])
return
response
picampaign/urls.py
View file @
b4c50a97
...
...
@@ -6,7 +6,7 @@ from rest_framework_nested import routers
from
picampaign.campaign.views
import
(
CampaignViewSet
,
CampaignContactViewSet
,
ArgumentaryViewSet
)
from
picampaign.feedback.views
import
FeedbackViewSet
from
picampaign.feedback.views
import
FeedbackViewSet
,
FeedbackExportCSVView
from
picampaign.organization.views
import
(
CategoryViewSet
,
GroupTypeViewSet
,
GroupViewSet
,
OrganizationViewSet
)
...
...
@@ -29,5 +29,6 @@ urlpatterns = [
url
(
r
'^'
,
include
(
router
.
urls
)),
url
(
r
'^'
,
include
(
campaign_router
.
urls
)),
url
(
r
'^i18n/'
,
include
(
'django.conf.urls.i18n'
)),
url
(
r
'^docs/'
,
include
(
'rest_framework_docs.urls'
))
url
(
r
'^docs/'
,
include
(
'rest_framework_docs.urls'
)),
url
(
r
'^export/'
,
FeedbackExportCSVView
),
]
+
static
(
settings
.
MEDIA_URL
,
document_root
=
settings
.
MEDIA_ROOT
)
okhin
🚴
@okhin
mentioned in issue
#13 (closed)
·
Jun 14, 2017
mentioned in issue
#13 (closed)
mentioned in issue #13
Toggle commit list
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