Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initialize setting review / proposal stage page #782

Draft
wants to merge 24 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
1497d90
Initialize setting review / proposal stage page
alice6373 May 21, 2020
f3095e6
Alice fixup with love
alice6373 Jul 18, 2020
8bb98fb
Merge branch 'master' into page-for-setting-review-stage
alice6373 Aug 30, 2020
57d036c
Clear gui
alice6373 Sep 27, 2020
e3fcda2
Merge branch 'master' into page-for-setting-review-stage
alice6373 Sep 27, 2020
2881ea9
Default timezone sring handling
alice6373 Oct 2, 2020
db4fea7
rename to Review Stages
alice6373 Oct 4, 2020
6ef2f5b
Generating timezone dynamically with pytz
alice6373 Oct 12, 2020
211bf3c
Delete comment in review_stages.html
alice6373 Oct 12, 2020
048c941
Delete print() in view.py
alice6373 Oct 12, 2020
76c39dc
Merge branch 'master' into page-for-setting-review-stage
alice6373 Oct 12, 2020
fdd09ab
Update GUI
alice6373 Oct 13, 2020
8ade9c1
return value add reviews_state()
alice6373 Oct 26, 2020
cfb5fa1
Rename First Round Review_2 to First Round Review
alice6373 Oct 26, 2020
afaf6d5
Change the typography to vertical
alice6373 Dec 10, 2020
88ee598
Rename First Round Review_1 to Locked (proposal editing and reviewing…
alice6373 Dec 10, 2020
9ef909e
Enhance user friendliness : accepting pycontw-2020.proposals.disable.…
alice6373 Dec 15, 2020
d579e69
Enhance user friendliness : Try more django date format (DATETIME_INP…
alice6373 Dec 15, 2020
2fb312d
Enhance user friendliness : display current review stage setting
alice6373 Dec 22, 2020
500b9db
Enhance user friendliness : automatically load the current settings t…
alice6373 Dec 27, 2020
ced5b07
Move url.py & view.py to more precise folder
alice6373 Dec 27, 2020
928e2d1
Fix problem that current settings will not be loaded after submitting…
alice6373 Dec 28, 2020
32f30a1
Merge branch 'master' into page-for-setting-review-stage
alice6373 Jan 16, 2021
c4ef31e
proposals.disabled.after not be required
alice6373 Jan 16, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/locale/zh_Hant/LC_MESSAGES/django.po
Original file line number Diff line number Diff line change
Expand Up @@ -1443,6 +1443,12 @@ msgstr "更改密碼"
msgid "Reviews"
msgstr "審查"

#: templates/default/_includes/dashboard_tablist.html:28
#: templates/default/reviews/review_stages.html:12
#: templates/default/reviews/review_stages.html:18
msgid "Review Stages"
msgstr "審查階段"

#: templates/default/_includes/nav/dashboard_nav.html:10
msgid "Log out"
msgstr "登出"
Expand Down
7 changes: 6 additions & 1 deletion src/proposals/templatetags/proposals.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from django.template import Library

from django.conf import settings
from proposals.utils import SEP_DEFAULT, SEP_LAST, format_names


Expand All @@ -11,3 +11,8 @@ def speaker_names_display(
proposal, sep_default=SEP_DEFAULT, sep_last=SEP_LAST):
names = [info.user.speaker_name for info in proposal.speakers]
return format_names(names, sep_default=sep_default, sep_last=sep_last)


@register.filter
def configuration_switch(value):
return settings.CONFERENCE_DEFAULT_SLUG + value
17 changes: 17 additions & 0 deletions src/static/css/components/_buttons.scss
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
@include button-variant($btn-natural-color, $btn-natural-bg, $btn-natural-border);
}

.btn-natural-noborder {
@include button-variant($btn-natural-color, $btn-natural-bg, $btn-natural-border);
}

.btn-action{
@include button-variant($btn-action-color, $btn-action-bg, $btn-action-border);
}
Expand Down Expand Up @@ -40,6 +44,19 @@
}
}

.btn-natural-noborder {
&:hover {
background-color: $btn-natural-hover-bg;
}
&,
&:focus,
&:active {
outline: none;
border-color: transparent;
}
margin-bottom: 20px;
}

.btn-natural.btn-withdraw {
&,
&:hover,
Expand Down
5 changes: 5 additions & 0 deletions src/static/css/components/_texts.scss
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,8 @@
.text-emphasize {
@include roboto-medium();
}

.input-customized-size input{
width: 16.2em;
}

47 changes: 47 additions & 0 deletions src/static/css/components/_toggle.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
.material-switch > input[type="checkbox"] {
display: none;
}

.material-switch > label {
cursor: pointer;
height: 0px;
position: relative;
width: 40px;
}

.material-switch > label::before {
background: rgb(0, 0, 0);
box-shadow: inset 0px 0px 10px rgba(0, 0, 0, 0.5);
border-radius: 8px;
content: '';
height: 16px;
margin-top: -8px;
position:absolute;
opacity: 0.3;
transition: all 0.4s ease-in-out;
width: 40px;
}

.material-switch > label::after {
background: rgb(255, 255, 255);
border-radius: 16px;
box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);
content: '';
height: 24px;
left: -4px;
margin-top: -8px;
position: absolute;
top: -4px;
transition: all 0.3s ease-in-out;
width: 24px;
}

.material-switch > input[type="checkbox"]:checked + label::before {
background: inherit;
opacity: 0.5;
}

.material-switch > input[type="checkbox"]:checked + label::after {
background: inherit;
left: 20px;
}
alice6373 marked this conversation as resolved.
Show resolved Hide resolved
1 change: 1 addition & 0 deletions src/static/css/main.scss
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
@import "components/tables";
@import "components/texts";
@import "components/lists";
@import "components/toggle";

// Pages
@import "pages/proposals";
Expand Down
3 changes: 2 additions & 1 deletion src/static/css/vendors/bootstrap/_buttons.scss
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ a.btn {
&:hover,
&:focus,
&:active {
outline: none;
border-color: transparent;
}
&:hover,
Expand All @@ -128,7 +129,6 @@ a.btn {
}
}


// Button Sizes
// --------------------------------------------------

Expand Down Expand Up @@ -166,3 +166,4 @@ input[type="button"] {
width: 100%;
}
}

84 changes: 84 additions & 0 deletions src/static/js/reviews/review_stages.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@

var proposals_creatable = document.getElementById("proposals.creatable");
var proposals_editable = document.getElementById("proposals.editable");
var proposals_withdrawable = document.getElementById("proposals.withdrawable");
var reviews_stage = document.getElementById("reviews.stage");
var reviews_visible_to_submitters = document.getElementById("reviews.visible.to.submitters");

$('.hotkey').click(function () {
if ($(this).val() == "Call for Proposals") {
Call_for_Proposals();
}
else if ($(this).val() == "First Round Review_1") {
First_Round_Review_1()
}
else if ($(this).val() == "First Round Review") {
First_Round_Review()
}
else if ($(this).val() == "Modification Stage") {
Modification_Stage()
}
else if ($(this).val() == "Second Round Review") {
Second_Round_Review()
}
else if ($(this).val() == "Internal Decision") {
Internal_Decision()
}
else {
Announcement_of_Acceptance()
}

/*
Proposal Review Stage Setting
Reference : https://github.com/pycontw/pycon.tw/blob/master/src/reviews/README.md
*/
function Call_for_Proposals(){
proposals_creatable.checked = true;
proposals_editable.checked = true;
proposals_withdrawable.checked = true;
reviews_stage.value = 0;
reviews_visible_to_submitters.checked = false;
}
function First_Round_Review_1() {
proposals_creatable.checked = false;
proposals_editable.checked = false;
proposals_withdrawable.checked = false;
reviews_stage.value = "0";
reviews_visible_to_submitters.checked = false;
}
function First_Round_Review() {
proposals_creatable.checked = false;
proposals_editable.checked = false;
proposals_withdrawable.checked = false;
reviews_stage.value = "1";
reviews_visible_to_submitters.checked = false;
}
function Modification_Stage() {
proposals_creatable.checked = false;
proposals_editable.checked = true;
proposals_withdrawable.checked = false;
reviews_stage.value = "0";
reviews_visible_to_submitters.checked = true;
}
function Second_Round_Review() {
proposals_creatable.checked = false;
proposals_editable.checked = false;
proposals_withdrawable.checked = false;
reviews_stage.value = "2";
reviews_visible_to_submitters.checked = false;
}
function Internal_Decision() {
proposals_creatable.checked = false;
proposals_editable.checked = false;
proposals_withdrawable.checked = false;
reviews_stage.value = "0";
reviews_visible_to_submitters.checked = false;
}
function Announcement_of_Acceptance() {
proposals_creatable.checked = false;
proposals_editable.checked = true;
proposals_withdrawable.checked = false;
reviews_stage.value = "0";
reviews_visible_to_submitters.checked = true;
}
});
6 changes: 6 additions & 0 deletions src/templates/default/_includes/dashboard_tablist.html
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,10 @@
{% endif %}
</li>
{% endif %}

{% if user.is_superuser %}
<li class="{% if active == 'admin' %}active{% endif %}">
<a href="{% url 'review_stages' %}">{% trans 'Review Stages' %}</a>
</li>
{% endif %}
</ul>
114 changes: 114 additions & 0 deletions src/templates/default/reviews/review_stages.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
{% extends 'dashboard_base.html' %}

{% load i18n static %}
{% load proposals %}
{% load compress crispy_forms_tags %}
{% load tz %}
{% get_current_timezone as TIME_ZONE %}

{% block dashboard_tablist %}
{% include '_includes/dashboard_tablist.html' with active='admin' %}
{% endblock dashboard_tablist %}

{% block main-content %}

<h3 class="dashboard-header">
<span class="header-title">{% trans 'Review Stages' %}</span>
</h3>

<div class="dashboard-body">
<!--Hot Key Button-->
<div class="col-md-3">
{% for rs in review_stages_list %}
<button class="btn btn-natural-noborder hotkey" value="{{ rs }}">{{ rs }}</button>
{% endfor %}
</div>
<!--Review Change Setting-->
<div class="col-md-9">
tomatoprinx marked this conversation as resolved.
Show resolved Hide resolved
<form action="{% url 'review_stages' %}" method="post">
{% csrf_token %}
<div class="panel panel-default">
<div class="panel-heading">{% trans 'Review Stages' %}
<div class="material-switch pull-right">
<a href="https://github.com/pycontw/pycon.tw/blob/master/src/reviews/README.md">See Proposal Review System
Documentation</a>
</div>
</div>
<ul class="list-group">
<li class="panel-title list-group-item">
{{ ".proposals.creatable"|configuration_switch }}
<div class="material-switch pull-right">
<input name="proposals.creatable" type='hidden' value="false" />
<input id="proposals.creatable" name="proposals.creatable" type="checkbox" value="true"/>
<label for="proposals.creatable" class="label-info"></label>
</div>
</li>
<li class="panel-title list-group-item">
{{ ".proposals.editable"|configuration_switch }}
<div class="material-switch pull-right">
<input name="proposals.editable" type='hidden' value="false" />
<input id="proposals.editable" name="proposals.editable" type="checkbox" value="true"/>
<label for="proposals.editable" class="label-info"></label>
</div>
</li>
<li class="panel-title list-group-item">
{{ ".proposals.withdrawable"|configuration_switch }}
<div class="material-switch pull-right">
<input name="proposals.withdrawable" type='hidden' value="false" />
<input id="proposals.withdrawable" name="proposals.withdrawable" type="checkbox" value="true"/>
<label for="proposals.withdrawable" class="label-info"></label>
</div>
</li>
<li class="panel-title list-group-item">
{{ ".reviews.visible.to.submitters"|configuration_switch }}
<div class="material-switch pull-right">
<input name="reviews.visible.to.submitters" type='hidden' value="false" />
<input id="reviews.visible.to.submitters" name="reviews.visible.to.submitters"
type="checkbox" value="true"/>
<label for="reviews.visible.to.submitters" class="label-info"></label>
</div>
</li>
<li class="panel-title list-group-item">
{{ ".reviews.stage"|configuration_switch }}
<div class="input-customized-size pull-right">
<input id="reviews.stage" name="reviews.stage" type="number" min="0" max="2"
placeholder="Int" required="required">
</div>
</li>
<li class="panel-title list-group-item">
{{ ".proposals.disable.after"|configuration_switch }}
<div class="input-customized-size pull-right">
<input name="proposals.disable.after" type="datetime-local" step="1"
placeholder="yyyy-mm-dd hh:mm:ss" required="required">
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am having doubts about making this field "required" because I think we should be able to disable it by not providing any value?

And another thing is that the backend needs the format exactly as YYYY-mm-ddThh:mm:ss, you need to put the T in there, but the placeholder hints without the T. I personally think that YYYY-mm-dd hh:mm:ss should be more user-friendly, and you can consider accepting values without ss (treat missing ss as 0).

You can take a look at how django implements this here:
https://github.com/django/django/blob/master/django/forms/fields.py#L366

They take multiple possible formats and try one another, described in here https://docs.djangoproject.com/en/3.0/ref/settings/#datetime-input-formats

I think this is a little bit too much, but if you have time you can try this. The bottom line is at least make it more user friendly and the frontend hint needs to meet the backend validation criteria.

Copy link
Contributor Author

@alice6373 alice6373 Dec 20, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider accepting values without ss -> 9ef909e

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But on the other hand, what does it mean that we should be able to disable it by not providing any value ? Is it for users to change a value individually?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What I meant is that, proposals.disabled.after should take effect if this key / value is set. If no value is set for this key, like, an empty value, then it will never be disabled after any time.

</div>
</li>
<li class="panel-title list-group-item">
timezone
<div class="input-customized-size pull-right">
<select name="review_timezone">
{% for tz in timezones %}
<option value="{{ tz }}" {% if tz == TIME_ZONE %} selected{% endif %}>{{ tz }}</option>
{% endfor %}
</select>
</div>
</li>
</ul>
</div>

<div class="nesting-form-group">
{{ form|crispy }}
<button type="submit" class="btn btn-info pull-right">
{% trans 'Submit' %}
</button>
</div>
</form>
</div>
</div>

{% endblock main-content %}

{% block extra_js %}
{% compress js %}
<script src="{% static 'js/reviews/review_stages.js' %}"></script>
{% endcompress %}
{% endblock extra_js %}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you should read current values from the database and show current settings on page load.

Something like

<script src="{% static 'js/reviews/review_stages.js' %}"></script>
<script>
proposals_creatable.checked = {% if proposals_creatable %}true{% else %}false;
proposals_editable.checked = {% if proposals_editable %}true{% else %}false;
proposals_withdrawable.checked = {% if proposals_withdrawable %}true{% else %}false;
reviews_stage.value = {{ reviews_stage }};
reviews_visible_to_submitters.checked = {% if reviews_visible_to_submitters %}true{% else %}false;
</script>

The above is just a sample code, very ugly, but just a simple demonstration of how django template variables and javscript can be integrated together.

Copy link
Contributor Author

@alice6373 alice6373 Dec 27, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are currently two ways to display the current settings. The first is that your suggestions are automatically loaded into the form that will be submitted (500b9db). The second is to list the current settings in another list (2fb312d).

But the web page is a bit crowded.
image

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the two functions of the current review stage status and the set review stage can be presented in different pages ?Do you have more ideas ?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

uh... what I mean is that the boolean switches should represent the current set values. So that when the admin sees the page, current settings are clear. And the admin can do some minor tuning without "not knowning" what current values look like.

我想用中文可能比較好表達。原本是不會載入目前的設定的,所以每次進來這一頁都是 false、或者是空的值。這樣其實很難一目瞭然目前到底是哪一個階段,或者是說目前的設定到底是長怎樣。期待的樣子是我進來的時候,所有的值就是目前的設定。舉個很爛的例子,假設目前是 editable、withdrawable 是開的,然後突然要很臨時的開放 creatable 一小段時間,我就只要把 creatable 打開,然後時間過了我再把它關起來。我就不需要再一個一個確認其他某一個的值是什麼,然後小心翼翼的調整怕弄錯,然後改完又要再小心翼翼的改回去。

Loading