Skip to content
Snippets Groups Projects
Commit 297ea6ad authored by Jiří Kalvoda's avatar Jiří Kalvoda
Browse files

Označení neaktivovaných účtů -- vytvoření user_html_flags

Closes #196
parent fad03376
No related branches found
No related tags found
No related merge requests found
This commit is part of merge request !82. Comments created here will be created in the context of that merge request.
...@@ -14,6 +14,8 @@ from mo.web import app ...@@ -14,6 +14,8 @@ from mo.web import app
from mo.web.org_contest import contest_breadcrumbs from mo.web.org_contest import contest_breadcrumbs
from mo.web.org_place import place_breadcrumbs from mo.web.org_place import place_breadcrumbs
from mo.web.util import user_html_flags
# Konfigurace Jinjy # Konfigurace Jinjy
app.jinja_options['extensions'].append('jinja2.ext.do') app.jinja_options['extensions'].append('jinja2.ext.do')
...@@ -96,7 +98,10 @@ def yes_no(a: bool) -> str: ...@@ -96,7 +98,10 @@ def yes_no(a: bool) -> str:
def json_pretty(js: Any) -> str: def json_pretty(js: Any) -> str:
return json.dumps(js, sort_keys=True, indent=4, ensure_ascii=False) return json.dumps(js, sort_keys=True, indent=4, ensure_ascii=False)
  • V běžném pythoním stylu se mezi globálními funkcemi vynechávají 2 řádky. Držel bych se toho, nemáme-li silný důvod proti. (I jinde.)

  • Jiří Kalvoda @jirikalvoda

    changed this line in version 2 of the diff

    ·

    changed this line in version 2 of the diff

    Toggle commit list
  • Please register or sign in to reply
@app.template_global() @app.template_global()
def log_url(typ: str, id: int) -> str: def log_url(typ: str, id: int) -> str:
return url_for('org_log', typ=typ, id=id) return url_for('org_log', typ=typ, id=id)
@app.template_filter()
def user_flags(u: db.User) -> Markup:
return user_html_flags(u)
...@@ -25,7 +25,7 @@ from mo.util_format import inflect_number, inflect_by_number ...@@ -25,7 +25,7 @@ from mo.util_format import inflect_number, inflect_by_number
from mo.web import app from mo.web import app
import mo.web.util import mo.web.util
from mo.web.util import MODecimalField, PagerForm from mo.web.util import MODecimalField, PagerForm
from mo.web.table import CellCheckbox, Table, Row, Column, cell_pion_link, cell_place_link, cell_email_link from mo.web.table import CellCheckbox, Table, Row, Column, cell_pion_link, cell_place_link, cell_email_link, CellMarkup
import wtforms.validators as validators import wtforms.validators as validators
from wtforms.widgets.html5 import NumberInput from wtforms.widgets.html5 import NumberInput
...@@ -551,16 +551,15 @@ def make_contestant_table(query: Query, round: db.Round, add_checkbox: bool = Fa ...@@ -551,16 +551,15 @@ def make_contestant_table(query: Query, round: db.Round, add_checkbox: bool = Fa
html_attr = { html_attr = {
'class': 'state-' + pion.state.name 'class': 'state-' + pion.state.name
} }
if u.is_test:
html_attr['class'] += ' testuser'
html_attr['title'] = 'Testovací uživatel'
rows.append(Row( rows.append(Row(
keys={ keys={
'sort_key': u.sort_key(), 'sort_key': u.sort_key(),
'user_id': u.user_id, 'user_id': u.user_id,
'first_name': cell_pion_link(u, pion.contest_id, u.first_name), 'first_name': cell_pion_link(u, pion.contest_id, u.first_name),
'last_name': cell_pion_link(u, pion.contest_id, u.last_name), 'last_name': cell_pion_link(u, pion.contest_id, u.last_name),
'email': cell_email_link(u), 'email': CellMarkup(
str(cell_email_link(u)),
cell_email_link(u).to_html()+str(mo.web.util.user_html_flags(u))),
  • Tohle je zbytečně složité. Nauč CellMarkup, aby akceptovala i objekty typu Markup.

  • Author Maintainer

    V čem se ti to tady zjednoduší? Máš jeden str a jeden Markup a potřebuješ je spojit. Tak jako tak musíš udělat jeden převod.

    Jinak s implementováním funkčnosti akceptování ale souhlasím.

  • Především bych cell_email_link negeneroval dvakrát.

    Nevyrobíš na adresu s flagy samostatný typ buňky, ať tohle nestraší ve výrobě formuláře? Pak by možná bylo lepší to konstruovat přímo a ne sestrojením a hned zase rozebráním buňky s klikací adresou.

  • Jiří Kalvoda @jirikalvoda

    changed this line in version 3 of the diff

    ·

    changed this line in version 3 of the diff

    Toggle commit list
  • Author Maintainer

    Moc nevím jak to udělat hezky, ale něco jsem spáchal. Viz aktuální stav.

  • Please register or sign in to reply
'school': pant.school_place.name, 'school': pant.school_place.name,
'school_code': cell_place_link(pant.school_place, pant.school_place.get_code()), 'school_code': cell_place_link(pant.school_place, pant.school_place.get_code()),
'grade': pant.grade, 'grade': pant.grade,
... ...
......
...@@ -61,7 +61,7 @@ konkrétní úlohu. Symbol <span class="icon">🗐</span> značí, že existuje ...@@ -61,7 +61,7 @@ konkrétní úlohu. Symbol <span class="icon">🗐</span> značí, že existuje
</thead> </thead>
{% for pion in pions %} {% for pion in pions %}
{% set u = pion.user %} {% set u = pion.user %}
<tr class="state-{{ pion.state.name }}{% if u.is_test %} testuser{% endif %}" {% if u.is_test %}title="Testovací uživatel"{% endif %}> <tr class="state-{{ pion.state.name }}>
<th>{{ u|pion_link(contest.contest_id) }} <th>{{ u|pion_link(contest.contest_id) }}
<td>{{ pion.state.friendly_name() }} <td>{{ pion.state.friendly_name() }}
{% set sum_points = [] %} {% set sum_points = [] %}
... ...
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
</thead> </thead>
<tr><td>Jméno:<td>{{ user.first_name }} <tr><td>Jméno:<td>{{ user.first_name }}
<tr><td>Příjmení:<td>{{ user.last_name }} <tr><td>Příjmení:<td>{{ user.last_name }}
<tr><td>E-mail:<td>{{ user.email|mailto }} <tr><td>E-mail:<td>{{ user.email|mailto }}{{ user|user_flags }}
<tr><td>Škola:<td><a href='{{ url_for('org_place', id=pant.school) }}'>{{ pant.school_place.name }}</a> <tr><td>Škola:<td><a href='{{ url_for('org_place', id=pant.school) }}'>{{ pant.school_place.name }}</a>
<tr><td>Třída:<td>{{ pant.grade }} <tr><td>Třída:<td>{{ pant.grade }}
<tr><td>Rok narození:<td>{{ pant.birth_year }} <tr><td>Rok narození:<td>{{ pant.birth_year }}
... ...
......
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
{% for user in users %} {% for user in users %}
<tr> <tr>
<td>{{ user.first_name }}</td><td>{{ user.last_name }}</td> <td>{{ user.first_name }}</td><td>{{ user.last_name }}</td>
<td>{{ user.email|mailto }}{% if user.password_hash == None %}<span class="user-inactive" title='Účet dosud nebyl aktivován'> *</span>{% endif %}</td> <td>{{ user.email|mailto }}{{ user|user_flags }}</td>
<td>{% if user.is_admin %}správce{% elif user.roles|count == 0 %}<i>žádná role</i>{% else %} <td>{% if user.is_admin %}správce{% elif user.roles|count == 0 %}<i>žádná role</i>{% else %}
<ul> <ul>
{% for role in user.roles %} {% for role in user.roles %}
... ...
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
{% set site_id = sc.site.place_id if sc.site else None %} {% set site_id = sc.site.place_id if sc.site else None %}
<table class="data"> <table class="data">
<tr><th>Účastník<td>{{ sc.user|pion_link(sc.contest.contest_id) }} <tr><th>Účastník<td>{{ sc.user|pion_link(sc.contest.contest_id) }}{{ sc.user|user_flags}}
<tr><th>Úloha<td><a href='{{ url_for('org_contest_task', contest_id=sc.contest.contest_id, site_id=site_id, task_id=sc.task.task_id) }}'>{{ sc.task.code }} {{ sc.task.name }}</a> <tr><th>Úloha<td><a href='{{ url_for('org_contest_task', contest_id=sc.contest.contest_id, site_id=site_id, task_id=sc.task.task_id) }}'>{{ sc.task.code }} {{ sc.task.name }}</a>
{% if solution %} {% if solution %}
<tr><th>Body<td> <tr><th>Body<td>
... ...
......
...@@ -73,9 +73,9 @@ ...@@ -73,9 +73,9 @@
</tr> </tr>
</thead> </thead>
{% for user in users %} {% for user in users %}
<tr{% if user.is_test %} class="testuser" title="Testovací uživatel"{% endif %}> <tr>
<td>{{ user.first_name }}</td><td>{{ user.last_name }}</td> <td>{{ user.first_name }}</td><td>{{ user.last_name }}</td>
<td>{{ user.email|mailto }}{% if user.password_hash == None %}<span class="user-inactive" title='Účet dosud nebyl aktivován'> *</span>{% endif %}</td> <td>{{ user.email|mailto }}{{ user|user_flags }}</td>
<td>{% if user.participants|count == 0 %}<i>v žádném ročníku</i>{% else %} <td>{% if user.participants|count == 0 %}<i>v žádném ročníku</i>{% else %}
<ul> <ul>
{% for participant in user.participants %} {% for participant in user.participants %}
... ...
......
...@@ -35,14 +35,14 @@ finální (ve výchozím stavu poslední nahrané).{% elif sc.allow_upload_solut ...@@ -35,14 +35,14 @@ finální (ve výchozím stavu poslední nahrané).{% elif sc.allow_upload_solut
{% set u = for_user or obj.user %} {% set u = for_user or obj.user %}
  • (Pardon, tohle patří k commitu jako celku, ale tam Gitlab neumí připsat komentář.)

    Napiš prosím commit message, která celou změnu vysvětluje. Hlavním účelem přeci není vytvoření nějaké funkce :)

    Dokonce by mi to přišlo lepší rozdělit na víc commitů: (1) zavedení funkce a filtru, (2) jeho používání, (3) úklid CSS.

  • Please register or sign in to reply
{% set task = for_task or obj %} {% set task = for_task or obj %}
{% if for_task %} {% if for_task %}
<tr class="state-{{ obj.state.name }}{% if u.is_test %} testuser{% endif %}" {% if u.is_test %}title="Testovací uživatel"{% endif %}> <tr class="state-{{ obj.state.name }}">
{% else %} {% else %}
<tr> <tr>
{% endif %} {% endif %}
<td>{% if for_user %} <td>{% if for_user %}
<a href='{{ url_for('org_contest_task', contest_id=ct_id, task_id=task.task_id) }}'>{{ task.code }} {{ task.name }}</a> <a href='{{ url_for('org_contest_task', contest_id=ct_id, task_id=task.task_id) }}'>{{ task.code }} {{ task.name }}</a>
{% else %} {% else %}
{{ u|pion_link(contest.contest_id) }}</a> {{ u|pion_link(contest.contest_id) }}{{ u|user_flags }}</a>
{% endif %} {% endif %}
{% if for_task %}<td>{{ obj.state.friendly_name() }}{% endif %} {% if for_task %}<td>{{ obj.state.friendly_name() }}{% endif %}
{% if sol %} {% if sol %}
... ...
......
...@@ -9,6 +9,7 @@ import werkzeug.exceptions ...@@ -9,6 +9,7 @@ import werkzeug.exceptions
import werkzeug.utils import werkzeug.utils
import wtforms import wtforms
from wtforms.fields.html5 import DecimalField from wtforms.fields.html5 import DecimalField
from markupsafe import Markup
import mo.db as db import mo.db as db
import mo.jobs import mo.jobs
...@@ -145,3 +146,11 @@ class MODecimalField(DecimalField): ...@@ -145,3 +146,11 @@ class MODecimalField(DecimalField):
d /= 10 d /= 10
return super(MODecimalField, self)._value() return super(MODecimalField, self)._value()
def user_html_flags(u: db.User) -> Markup:
r = []
if u.is_test:
r.append(Markup("<span class='user-test' title='Testovací uživatel'> *</span>"))
if u.is_inactive():
r.append(Markup("<span class='user-inactive' title='Účet dosud nebyl aktivován'> *</span>"))
return Markup("").join(r)
  • Tohle mi přijde poněkud klikaté: nechceš to nejdřív sestrojit jako string, a teprve pak ho celý převést na Markup?

  • Author Maintainer

    Proč není dobré pracovat s Markupy v případě, že se o Markup jedná? Kdybychom třeba někdy vkládali do nějakého title kus uživatelského vstupu, tak bude jasnější, že se to musí escapovat.

  • Pardon, asi medvědí tendence příliš koukat pod povrch a litovat té spousty objektů, co naprosto zbytečně vzniká a hned zase zaniká :)

    Možná je lepší to do Markupu zabalit co nejdřív ... ale pokud o tom chceme uvažovat takto, asi bychom měli revidovat celý systém tabulkových buněk a jejich variantu v HTML také rovnou vracet jako Markup.

  • Jiří Kalvoda @jirikalvoda

    changed this line in version 3 of the diff

    ·

    changed this line in version 3 of the diff

    Toggle commit list
  • Please register or sign in to reply
...@@ -114,16 +114,6 @@ table.data td.sol-warn { ...@@ -114,16 +114,6 @@ table.data td.sol-warn {
background-color: #ffaaaa; background-color: #ffaaaa;
} }
table tr.testuser {
opacity: 0.7;
background: repeating-linear-gradient(
45deg,
white,
white 10px,
#ddd 10px,
#ddd 20px
);
}
table tr.state-disqualified, table tr.state-disqualified a:not(.btn) { table tr.state-disqualified, table tr.state-disqualified a:not(.btn) {
color: red; color: red;
} }
...@@ -256,6 +246,9 @@ table.data tbody tr.job-failed:hover { ...@@ -256,6 +246,9 @@ table.data tbody tr.job-failed:hover {
/* Users */ /* Users */
.user-test {
color: green;
}
.user-inactive { .user-inactive {
color: red; color: red;
} }
... ...
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment