Merge branch 'ticket-testing' into 'master'
Expand proposal admin; add CFP management links See merge request LCA2018/symposion_app!42
This commit is contained in:
commit
fa64473d58
10 changed files with 198 additions and 45 deletions
|
@ -5,7 +5,7 @@
|
|||
"end": "2017-11-30T12:59:00Z",
|
||||
"published": false,
|
||||
"section": 3,
|
||||
"start": "2017-09-21T14:01:00Z"
|
||||
"start": "2017-11-01T14:01:00Z"
|
||||
},
|
||||
"model": "symposion_proposals.proposalsection",
|
||||
"pk": 3
|
||||
|
@ -16,7 +16,7 @@
|
|||
"end": "2017-11-30T12:59:00Z",
|
||||
"published": false,
|
||||
"section": 4,
|
||||
"start": "2017-09-21T14:01:00Z"
|
||||
"start": "2017-11-01T14:01:00Z"
|
||||
},
|
||||
"model": "symposion_proposals.proposalsection",
|
||||
"pk": 4
|
||||
|
@ -27,7 +27,7 @@
|
|||
"end": "2017-11-30T12:59:00Z",
|
||||
"published": false,
|
||||
"section": 5,
|
||||
"start": "2017-09-21T14:01:00Z"
|
||||
"start": "2017-11-01T14:01:00Z"
|
||||
},
|
||||
"model": "symposion_proposals.proposalsection",
|
||||
"pk": 5
|
||||
|
@ -38,7 +38,7 @@
|
|||
"end": "2017-11-30T12:59:00Z",
|
||||
"published": false,
|
||||
"section": 6,
|
||||
"start": "2017-09-21T14:01:00Z"
|
||||
"start": "2017-11-01T14:01:00Z"
|
||||
},
|
||||
"model": "symposion_proposals.proposalsection",
|
||||
"pk": 6
|
||||
|
@ -49,7 +49,7 @@
|
|||
"end": "2017-11-29T13:01:00Z",
|
||||
"published": false,
|
||||
"section": 7,
|
||||
"start": "2017-09-21T14:01:00Z"
|
||||
"start": "2017-11-01T14:01:00Z"
|
||||
},
|
||||
"model": "symposion_proposals.proposalsection",
|
||||
"pk": 7
|
||||
|
|
|
@ -11,6 +11,7 @@ docker exec symposion ./manage.py migrate
|
|||
docker exec symposion ./manage.py loaddata ./fixtures/*.json
|
||||
docker exec symposion ./manage.py populate_inventory
|
||||
docker exec symposion ./manage.py create_review_permissions
|
||||
docker exec symposion ./manage.py loaddata ./fixtures/miniconf-fixtures/*.json
|
||||
if [ -e ./symposion-fixtures ]; then
|
||||
pushd ./symposion-fixtures
|
||||
./load_data_local.sh
|
||||
|
|
|
@ -2,29 +2,45 @@ from django.contrib import admin
|
|||
|
||||
from pinaxcon.proposals import models
|
||||
from symposion.proposals import models as symposion_models
|
||||
|
||||
|
||||
@admin.register(models.TalkProposal)
|
||||
@admin.register(models.TutorialProposal)
|
||||
@admin.register(models.MiniconfProposal)
|
||||
@admin.register(models.SysAdminProposal)
|
||||
@admin.register(models.KernelProposal)
|
||||
@admin.register(models.GamesProposal)
|
||||
@admin.register(models.OpenHardwareProposal)
|
||||
@admin.register(models.ClsXLCAProposal)
|
||||
@admin.register(models.FuncProgProposal)
|
||||
@admin.register(models.OpenEdProposal)
|
||||
@admin.register(models.OpenGLAMProposal)
|
||||
@admin.register(models.FPGAProposal)
|
||||
@admin.register(models.DevDevProposal)
|
||||
@admin.register(models.ArtTechProposal)
|
||||
@admin.register(models.BioInformaticsProposal)
|
||||
from symposion.reviews.models import ProposalResult
|
||||
|
||||
class CategoryAdmin(admin.ModelAdmin):
|
||||
|
||||
class AdditionalSpeakerInline(admin.TabularInline):
|
||||
model = symposion_models.AdditionalSpeaker
|
||||
|
||||
class ProposalResultInline(admin.TabularInline):
|
||||
model = ProposalResult
|
||||
readonly_fields = ["score"]
|
||||
fields = ["status"]
|
||||
|
||||
inlines = [
|
||||
AdditionalSpeakerInline,
|
||||
ProposalResultInline,
|
||||
]
|
||||
|
||||
|
||||
for model in [ models.TalkProposal, models.TutorialProposal,
|
||||
models.MiniconfProposal, models.SysAdminProposal,
|
||||
models.KernelProposal, models.GamesProposal,
|
||||
models.OpenHardwareProposal, models.ClsXLCAProposal,
|
||||
models.FuncProgProposal, models.OpenEdProposal,
|
||||
models.OpenGLAMProposal, models.FPGAProposal, models.DevDevProposal,
|
||||
models.ArtTechProposal, models.BioInformaticsProposal ]:
|
||||
admin.site.register(model, CategoryAdmin,
|
||||
list_display = [
|
||||
"id",
|
||||
"title",
|
||||
"speaker",
|
||||
"speaker_email",
|
||||
"kind",
|
||||
"target_audience",
|
||||
"status",
|
||||
"cancelled",
|
||||
],
|
||||
list_filter = [
|
||||
"result__status",
|
||||
"cancelled",
|
||||
],
|
||||
)
|
||||
|
||||
|
|
|
@ -256,6 +256,14 @@
|
|||
<li><a href="{% url "user_reviewed" section.section.slug %}">Reviewed by you</a></li>
|
||||
<li><a href="{% url "user_not_reviewed" section.section.slug %}">Not Reviewed by you</a></li>
|
||||
</ul>
|
||||
{% if section in manage_sections %}
|
||||
<ul>
|
||||
<li><a href="{% url "review_bulk_update" section.section.slug %}">Bulk Update</a></li>
|
||||
<li><a href="{% url "result_notification" section.section.slug "accepted" %}">Send notifications</a></li>
|
||||
<li><a href="{% url "review_status" section.section.slug %}">Voting Status</a></li>
|
||||
<li><a href="{% url "review_admin" section.section.slug %}">Reviewer Stats</a></li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -299,31 +307,32 @@
|
|||
{% endif %}
|
||||
</div>
|
||||
<div class="container">
|
||||
{% if available_teams %}
|
||||
<div class="page-header">
|
||||
<h3>Available Teams</h3>
|
||||
</div>
|
||||
<div clas="page-row">
|
||||
{% for team in available_teams %}
|
||||
<div class="col-xs-12 col-sm-6 col-lg-6">
|
||||
<div class="panel panel-primary">
|
||||
<div class="panel-heading">
|
||||
<h5>{{ team }}</h5>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{% if team.description %}<p>{{ team.description }}</p>{% endif %}
|
||||
<span class="label label-default">{{ team.get_access_display }}</span>
|
||||
<a class="btn btn-lg btn-primary" role="button" href="{% url "team_detail" team.slug %}">Details</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="page-row">
|
||||
{% if available_teams %}
|
||||
<div class="page-header">
|
||||
<h3>Available Teams</h3>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<div class="page-row">
|
||||
{% for team in available_teams %}
|
||||
<div class="col-xs-12 col-sm-6 col-lg-6">
|
||||
<div class="panel panel-primary">
|
||||
<div class="panel-heading">
|
||||
<h5>{{ team }}</h5>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{% if team.description %}<p>{{ team.description }}</p>{% endif %}
|
||||
<span class="label label-default">{{ team.get_access_display }}</span>
|
||||
<a class="btn btn-lg btn-primary" role="button" href="{% url "team_detail" team.slug %}">Details</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
{% endblock %} <!-- block content -->
|
||||
|
||||
|
|
|
@ -29,6 +29,14 @@
|
|||
<div class="container">
|
||||
{% sitetree_menu from "main" include "trunk" template "sitetree_header.html" %}
|
||||
|
||||
{% if messages %}
|
||||
<ul class="messagelist">
|
||||
{% for message in messages %}
|
||||
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
||||
<div class="well">
|
||||
<h1>{% block header_title %}{% endblock %}</h1>
|
||||
<p>{% block header_paragraph %}{% endblock %}</p>
|
||||
|
|
|
@ -1,3 +1,109 @@
|
|||
.label-required:after { content: ' *'; }
|
||||
textarea, .monospace-text { font-family: Hack, monospace; }
|
||||
.monospace-text { white-space: pre-wrap; }
|
||||
|
||||
/* MESSAGES & ERRORS */
|
||||
|
||||
ul.messagelist {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
ul.messagelist li {
|
||||
display: block;
|
||||
font-weight: 400;
|
||||
font-size: 13px;
|
||||
padding: 10px 10px 10px 65px;
|
||||
margin: 0 0 10px 0;
|
||||
background: #dfd url(../img/icon-yes.svg) 40px 12px no-repeat;
|
||||
background-size: 16px auto;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
ul.messagelist li.warning {
|
||||
background: #ffc url(../img/icon-alert.svg) 40px 14px no-repeat;
|
||||
background-size: 14px auto;
|
||||
}
|
||||
|
||||
ul.messagelist li.error {
|
||||
background: #ffefef url(../img/icon-no.svg) 40px 12px no-repeat;
|
||||
background-size: 16px auto;
|
||||
}
|
||||
|
||||
.errornote {
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
display: block;
|
||||
padding: 10px 12px;
|
||||
margin: 0 0 10px 0;
|
||||
color: #ba2121;
|
||||
border: 1px solid #ba2121;
|
||||
border-radius: 4px;
|
||||
background-color: #fff;
|
||||
background-position: 5px 12px;
|
||||
}
|
||||
|
||||
ul.errorlist {
|
||||
margin: 0 0 4px;
|
||||
padding: 0;
|
||||
color: #ba2121;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
ul.errorlist li {
|
||||
font-size: 13px;
|
||||
display: block;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
ul.errorlist li:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
ul.errorlist li a {
|
||||
color: inherit;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
td ul.errorlist {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
td ul.errorlist li {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.form-row.errors {
|
||||
margin: 0;
|
||||
border: none;
|
||||
border-bottom: 1px solid #eee;
|
||||
background: none;
|
||||
}
|
||||
|
||||
.form-row.errors ul.errorlist li {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.errors input, .errors select, .errors textarea {
|
||||
border: 1px solid #ba2121;
|
||||
}
|
||||
|
||||
div.system-message {
|
||||
background: #ffc;
|
||||
margin: 10px;
|
||||
padding: 6px 8px;
|
||||
font-size: .8em;
|
||||
}
|
||||
|
||||
div.system-message p.system-message-title {
|
||||
padding: 4px 5px 4px 25px;
|
||||
margin: 0;
|
||||
color: #c11;
|
||||
background: #ffefef url(../img/icon-no.svg) 5px 5px no-repeat;
|
||||
}
|
||||
|
||||
.description {
|
||||
font-size: 12px;
|
||||
padding: 5px 0 0 12px;
|
||||
}
|
||||
|
|
9
vendor/symposion/proposals/admin.py
vendored
9
vendor/symposion/proposals/admin.py
vendored
|
@ -28,5 +28,12 @@ from symposion.proposals.models import ProposalSection, ProposalKind
|
|||
# )
|
||||
|
||||
|
||||
admin.site.register(ProposalSection)
|
||||
admin.site.register(ProposalSection,
|
||||
list_display = [
|
||||
"section",
|
||||
"start",
|
||||
"end",
|
||||
"closed",
|
||||
"published"
|
||||
])
|
||||
admin.site.register(ProposalKind)
|
||||
|
|
1
vendor/symposion/proposals/models.py
vendored
1
vendor/symposion/proposals/models.py
vendored
|
@ -177,6 +177,7 @@ class ProposalBase(models.Model):
|
|||
except ObjectDoesNotExist:
|
||||
return _('Undecided')
|
||||
|
||||
|
||||
def speakers(self):
|
||||
yield self.speaker
|
||||
speakers = self.additional_speakers.exclude(
|
||||
|
|
2
vendor/symposion/proposals/views.py
vendored
2
vendor/symposion/proposals/views.py
vendored
|
@ -40,7 +40,7 @@ def proposal_submit(request):
|
|||
messages.info(request, _("To submit a proposal, please "
|
||||
"<a href='{0}'>log in</a> and create a speaker profile "
|
||||
"via the dashboard.".format(settings.LOGIN_URL)))
|
||||
return redirect("home") # @@@ unauth'd speaker info page?
|
||||
return redirect("dashboard") # @@@ unauth'd speaker info page?
|
||||
else:
|
||||
try:
|
||||
request.user.speaker_profile
|
||||
|
|
|
@ -3,9 +3,14 @@ from symposion.proposals.models import ProposalSection
|
|||
|
||||
def reviews(request):
|
||||
sections = []
|
||||
manage_sections = {}
|
||||
for section in ProposalSection.objects.all():
|
||||
if request.user.has_perm("reviews.can_review_%s" % section.section.slug):
|
||||
sections.append(section)
|
||||
if request.user.has_perm("reviews.can_manage_%s" % section.section.slug):
|
||||
manage_sections.setdefault(section, []).append
|
||||
return {
|
||||
"review_sections": sections,
|
||||
"manage_sections": manage_sections
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue