mirror of
https://github.com/krateng/maloja.git
synced 2023-08-10 21:12:55 +03:00
Created first experimental Jinja templates
This commit is contained in:
parent
1a64641fe6
commit
b3f4fc1246
28
maloja/database_packed.py
Normal file
28
maloja/database_packed.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
from . import database
|
||||||
|
|
||||||
|
# this is simply an object to expose all database functions with their arguments packed into dicts
|
||||||
|
# because jinja doesn't accept **kwargs
|
||||||
|
class DB:
|
||||||
|
def __getattr__(self,name):
|
||||||
|
originalmethod = getattr(database,name)
|
||||||
|
|
||||||
|
def packedmethod(*keys):
|
||||||
|
kwargs = {}
|
||||||
|
for k in keys:
|
||||||
|
kwargs.update(k)
|
||||||
|
return originalmethod(**kwargs)
|
||||||
|
|
||||||
|
return packedmethod
|
||||||
|
|
||||||
|
|
||||||
|
# class that is initialized with all the uri keys of the currently requested page and exposes curried db functions
|
||||||
|
class View:
|
||||||
|
def __init__(self,filterkeys,limitkeys,delimitkeys,amountkeys):
|
||||||
|
self.filterkeys = filterkeys
|
||||||
|
self.limitkeys = limitkeys
|
||||||
|
self.delimitkeys = delimitkeys
|
||||||
|
self.amountkeys = amountkeys
|
||||||
|
|
||||||
|
|
||||||
|
def get_pulse(self):
|
||||||
|
return database.get_pulse(**self.limitkeys,**self.delimitkeys,**self.filterkeys)
|
@ -171,17 +171,17 @@ def static(name,ext):
|
|||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
engine_prio = settings.get_settings("WEB_ENGINE_PRIORITY")
|
|
||||||
engines = {
|
|
||||||
"python":{"filetypes":["html","py"],"folder":"python"},
|
|
||||||
"pyhp":{"filetypes":["pyhp"],"folder":"pyhp"},
|
|
||||||
"jinja":{"filetypes":[],"folder":"jinja"}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
from . import database_packed
|
||||||
|
dbp = database_packed.DB()
|
||||||
|
|
||||||
JINJA_CONTEXT = {
|
JINJA_CONTEXT = {
|
||||||
# maloja
|
# maloja
|
||||||
"db": database,
|
"db": database,
|
||||||
|
"dbp":dbp,
|
||||||
"htmlmodules": htmlmodules,
|
"htmlmodules": htmlmodules,
|
||||||
"htmlgenerators": htmlgenerators,
|
"htmlgenerators": htmlgenerators,
|
||||||
"malojatime": malojatime,
|
"malojatime": malojatime,
|
||||||
@ -197,6 +197,12 @@ JINJA_CONTEXT = {
|
|||||||
('week','12 weeks',malojatime.thisweek().next(-11),'week',12),
|
('week','12 weeks',malojatime.thisweek().next(-11),'week',12),
|
||||||
('month','12 months',malojatime.thismonth().next(-11),'month',12),
|
('month','12 months',malojatime.thismonth().next(-11),'month',12),
|
||||||
('year','10 years',malojatime.thisyear().next(-9),'year',12)
|
('year','10 years',malojatime.thisyear().next(-9),'year',12)
|
||||||
|
],
|
||||||
|
"xranges": [
|
||||||
|
{"identifier":"day","localisation":"14 days","firstrange":malojatime.today().next(-13),"amount":14},
|
||||||
|
{"identifier":"week","localisation":"14 weeks","firstrange":malojatime.thisweek().next(-13),"amount":14},
|
||||||
|
{"identifier":"month","localisation":"14 months","firstrange":malojatime.thismonth().next(-13),"amount":14},
|
||||||
|
{"identifier":"year","localisation":"14 years","firstrange":malojatime.thisyear().next(-13),"amount":14}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,6 +211,8 @@ jinjaenv = Environment(
|
|||||||
loader=PackageLoader('maloja', 'web/jinja'),
|
loader=PackageLoader('maloja', 'web/jinja'),
|
||||||
autoescape=select_autoescape(['html', 'xml'])
|
autoescape=select_autoescape(['html', 'xml'])
|
||||||
)
|
)
|
||||||
|
jinjaenv.globals.update(JINJA_CONTEXT)
|
||||||
|
|
||||||
|
|
||||||
@webserver.route("/<name>")
|
@webserver.route("/<name>")
|
||||||
def static_html(name):
|
def static_html(name):
|
||||||
@ -228,13 +236,13 @@ def static_html(name):
|
|||||||
LOCAL_CONTEXT = {
|
LOCAL_CONTEXT = {
|
||||||
"adminmode":adminmode,
|
"adminmode":adminmode,
|
||||||
"apikey":request.cookies.get("apikey") if adminmode else None,
|
"apikey":request.cookies.get("apikey") if adminmode else None,
|
||||||
"_urikeys":keys #temporary!
|
"_urikeys":keys, #temporary!
|
||||||
}
|
}
|
||||||
LOCAL_CONTEXT["filterkeys"], LOCAL_CONTEXT["limitkeys"], LOCAL_CONTEXT["delimitkeys"], LOCAL_CONTEXT["amountkeys"] = uri_to_internal(keys)
|
LOCAL_CONTEXT["filterkeys"], LOCAL_CONTEXT["limitkeys"], LOCAL_CONTEXT["delimitkeys"], LOCAL_CONTEXT["amountkeys"] = uri_to_internal(keys)
|
||||||
|
|
||||||
template = jinjaenv.get_template(name + '.jinja')
|
template = jinjaenv.get_template(name + '.jinja')
|
||||||
|
|
||||||
res = template.render(**JINJA_CONTEXT,**LOCAL_CONTEXT)
|
res = template.render(**LOCAL_CONTEXT)
|
||||||
log("Generated page {name} in {time}s (Jinja)".format(name=name,time=clock.stop()),module="debug")
|
log("Generated page {name} in {time}s (Jinja)".format(name=name,time=clock.stop()),module="debug")
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
153
maloja/web/jinja/artist.jinja
Normal file
153
maloja/web/jinja/artist.jinja
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
{% extends "base.jinja" %}
|
||||||
|
{% block title %}Maloja - {{ artist }}{% endblock %}
|
||||||
|
|
||||||
|
{% block scripts %}
|
||||||
|
<script src="/rangeselect.js"></script>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% set artist = filterkeys.artist %}
|
||||||
|
{% set info = db.artistInfo(artist) %}
|
||||||
|
|
||||||
|
{% set credited = info.get('replace') %}
|
||||||
|
{% set included = info.get('associated') %}
|
||||||
|
{% set initialrange ='month' %}
|
||||||
|
|
||||||
|
|
||||||
|
{% if credited is not none %}
|
||||||
|
{% set competes = false %}
|
||||||
|
{% else %}
|
||||||
|
{% set credited = artist %}
|
||||||
|
{% set competes = true %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
|
{% set encodedartist = urihandler.compose_querystring(urihandler.internal_to_uri({'artist':artist})) %}
|
||||||
|
{% set encodedcredited = urihandler.compose_querystring(urihandler.internal_to_uri({'artist':credited})) %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<table class="top_info">
|
||||||
|
<tr>
|
||||||
|
<td class="image">
|
||||||
|
{% if adminmode %}
|
||||||
|
<div
|
||||||
|
class="changeable-image" data-uploader="b64=>upload('{encodedartist}','{apikey}',b64)"
|
||||||
|
style="background-image:url('{{ utilities.getArtistImage(artist=artist,fast=True) }}');"
|
||||||
|
></div>
|
||||||
|
{% else %}
|
||||||
|
<div style="background-image:url('{{ utilities.getArtistImage(artist=artist,fast=True) }}');">
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td class="text">
|
||||||
|
<h1>{{ artist }}</h1>
|
||||||
|
{% if competes %}<span class="rank"><a href="/charts_artists?max=100">{{ positionstring }}</a></span>{% endif %}
|
||||||
|
<br/>
|
||||||
|
{% if competes and included %}
|
||||||
|
<span>associated: {{ htmlgenerators.artistLinks(included) }}</span>
|
||||||
|
{% elif not competes %}
|
||||||
|
<span>Competing under {{ htmlgenerators.artistLink(credited) }} ({{ positionstring }})</span>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<p class="stats"><a href="/scrobbles?{{ encodedartist }}">{{ info['scrobbles'] }} Scrobbles</a></p>
|
||||||
|
|
||||||
|
|
||||||
|
{% import 'partials/awards.jinja' as awards %}
|
||||||
|
|
||||||
|
{% if competes %}
|
||||||
|
{{ awards.medals(info) }}
|
||||||
|
{{ awards.topweeks(info) }}
|
||||||
|
{% endif %}
|
||||||
|
{{ awards.certs(artist) }}
|
||||||
|
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h2><a href='/charts_tracks?{{ encodedartist }}'>Top Tracks</a></h2>
|
||||||
|
|
||||||
|
{# htmlmodules.module_trackcharts(**filterkeys,max_=15)[0] #}
|
||||||
|
{% import 'partials/charts_tracks.jinja' as charts_tracks %}
|
||||||
|
|
||||||
|
{{ charts_tracks.charts_tracks(filterkeys,limitkeys,amountkeys,compare=false) }}
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
<table class="twopart">
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<h2><a href='/pulse?{{ encodedartist }}&step=year&trail=1'>Pulse</a></h2>
|
||||||
|
|
||||||
|
{% for range in xranges %}
|
||||||
|
<span
|
||||||
|
onclick="showRangeManual('pulse','{{ range.identifier }}')"
|
||||||
|
class="stat_selector_pulse selector_pulse_{{ range.identifier }}"
|
||||||
|
style="{{ 'opacity:0.5;' if initialrange==range.identifier else '' }}">
|
||||||
|
{{ range.localisation }}
|
||||||
|
</span>
|
||||||
|
{% if not loop.last %}|{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<br/><br/>
|
||||||
|
|
||||||
|
{% import 'partials/pulse.jinja' as pulse %}
|
||||||
|
{% for range in xranges %}
|
||||||
|
|
||||||
|
<span
|
||||||
|
class="stat_module_pulse pulse_{{ range.identifier }}"
|
||||||
|
style="{{ 'display:none;' if initialrange==range.identifier else '' }}"
|
||||||
|
>
|
||||||
|
|
||||||
|
{{ pulse.pulse(filterkeys,{'since':range.firstrange},{'step':range.identifier,'trail':1},amountkeys) }}
|
||||||
|
</span>
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<!-- We use the same classes / function calls here because we want it to switch together with pulse -->
|
||||||
|
<h2><a href='/performance?{{ encodedcredited }}&step=year&trail=1'>Performance</a></h2>
|
||||||
|
|
||||||
|
{% for range in xranges %}
|
||||||
|
<span
|
||||||
|
onclick="showRangeManual('pulse','{{ range.identifier }}')"
|
||||||
|
class="stat_selector_pulse selector_pulse_{{ range.identifier }}"
|
||||||
|
style="{{ 'opacity:0.5;' if initialrange==range.identifier else '' }}">
|
||||||
|
{{ range.localisation }}
|
||||||
|
</span>
|
||||||
|
{% if not loop.last %}|{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<br/><br/>
|
||||||
|
|
||||||
|
{% import 'partials/performance.jinja' as performance %}
|
||||||
|
{% for range in xranges %}
|
||||||
|
|
||||||
|
<span
|
||||||
|
class="stat_module_pulse pulse_{{ range.identifier }}"
|
||||||
|
style="{{ 'display:none;' if initialrange==range.identifier else '' }}"
|
||||||
|
>
|
||||||
|
|
||||||
|
{{ performance.performance(filterkeys,{'since':range.firstrange},{'step':range.identifier,'trail':1},amountkeys) }}
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<h2><a href='/scrobbles?{encodedartist}'>Last Scrobbles</a></h2>
|
||||||
|
|
||||||
|
{% import 'partials/scrobbles.jinja' as scrobbles %}
|
||||||
|
{{ scrobbles.scrobbles(filterkeys,limitkeys,{"perpage":15,"page":0}) }}
|
||||||
|
|
||||||
|
|
||||||
|
{% endblock %}
|
65
maloja/web/jinja/partials/awards.jinja
Normal file
65
maloja/web/jinja/partials/awards.jinja
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
{% macro medals(info) %}
|
||||||
|
|
||||||
|
<!-- MEDALS -->
|
||||||
|
{% for year in info.medals.gold -%}
|
||||||
|
<a title="Best Artist in {{ year }}" class="hidelink medal shiny gold" href='/charts_artists?max=50&in={{ year }}'>
|
||||||
|
<span>{{ year }}</span>
|
||||||
|
</a>
|
||||||
|
{%- endfor %}
|
||||||
|
{% for year in info.medals.silver -%}
|
||||||
|
<a title="Second best Artist in {{ year }}" class="hidelink medal shiny silver" href='/charts_artists?max=50&in={{ year }}'>
|
||||||
|
<span>{{ year }}</span>
|
||||||
|
</a>
|
||||||
|
{%- endfor %}
|
||||||
|
{% for year in info.medals.bronze -%}
|
||||||
|
<a title="Third best Artist in {{ year }}" class="hidelink medal shiny bronze" href='/charts_artists?max=50&in={{ year }}'>
|
||||||
|
<span>{{ year }}</span>
|
||||||
|
</a>
|
||||||
|
{%- endfor %}
|
||||||
|
|
||||||
|
{%- endmacro %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% macro topweeks(info) %}
|
||||||
|
|
||||||
|
|
||||||
|
<!-- TOPWEEKS -->
|
||||||
|
<span>
|
||||||
|
{% if info.topweeks is not none %}
|
||||||
|
<a title="{{ info.topweeks }} weeks on #1" href="/performance?{{ encodedartist }}&step=week">
|
||||||
|
<img class="star" src="/media/star.png" />{{ info.topweeks }}
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
|
||||||
|
{%- endmacro %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% macro certs(artist) %}
|
||||||
|
|
||||||
|
<!-- CERTS -->
|
||||||
|
{% for track in db.get_tracks(artist=artist) %}
|
||||||
|
{% set info = db.trackInfo(track) %}
|
||||||
|
{% if info.certification is not none %}
|
||||||
|
<a href='{{ htmlgenerators.link_address(track) }}'>
|
||||||
|
<img class="certrecord_small"
|
||||||
|
src="/media/record_{{ info.certification }}.png"
|
||||||
|
title="{{ track.title }} has reached {{ info.certification.capitalize() }} status" />
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{%- endmacro %}
|
49
maloja/web/jinja/partials/charts_tracks.jinja
Normal file
49
maloja/web/jinja/partials/charts_tracks.jinja
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
{% macro charts_tracks(filterkeys,limitkeys,amountkeys,compare=False) %}
|
||||||
|
|
||||||
|
|
||||||
|
{% set tracks = dbp.get_charts_tracks(filterkeys,limitkeys) %}
|
||||||
|
{% if compare %}
|
||||||
|
{% if compare is true %}
|
||||||
|
{% set compare = limitkeys.timerange.next(step=-1) %}
|
||||||
|
{% endif %}
|
||||||
|
{% set prevtracks = dbp.get_charts_tracks(filterkeys,{'timerange':compare}) %}
|
||||||
|
|
||||||
|
{% set lastrank = {} %}
|
||||||
|
{% for t in tracks %}
|
||||||
|
{% if lastrank.update({(t.track.artists,t.track.title):t.rank}) %}{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% for t in tracks %}
|
||||||
|
{% if (t.track.artists,t.track.title) in lastrank %}
|
||||||
|
{% if t.update({'lastrank':lastrank[(t.track.artists,t.track.title)]}) %}{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
|
{% set maxbar = tracks[0]['scrobbles'] if tracks != [] else 0 %}
|
||||||
|
|
||||||
|
<table class='list'>
|
||||||
|
{% for e in tracks %}
|
||||||
|
<tr>
|
||||||
|
<!-- Rank -->
|
||||||
|
<td class="rank">{%if loop.changed(e.scrobbles) %}#{{ e.rank }}{% endif %}</td>
|
||||||
|
<!-- Rank change -->
|
||||||
|
{% if false %}
|
||||||
|
{% if e not in prevtracks %}<td class='rankup' title='New'>🆕</td>{% endif %}
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<!-- artist -->
|
||||||
|
{{ htmlgenerators.entity_column(e['track']) }}
|
||||||
|
|
||||||
|
<!-- scrobbles -->
|
||||||
|
<td class="amount">{{ htmlgenerators.scrobblesTrackLink(e['track'],urihandler.internal_to_uri(limitkeys),amount=e['scrobbles']) }}</td>
|
||||||
|
<td class="bar">{{ htmlgenerators.scrobblesTrackLink(e['track'],urihandler.internal_to_uri(limitkeys),percent=e['scrobbles']*100/maxbar) }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{%- endmacro %}
|
34
maloja/web/jinja/partials/performance.jinja
Normal file
34
maloja/web/jinja/partials/performance.jinja
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
{% macro performance(filterkeys,limitkeys,delimitkeys,amountkeys) %}
|
||||||
|
|
||||||
|
{% set ranges = dbp.get_performance(filterkeys,limitkeys,delimitkeys) %}
|
||||||
|
|
||||||
|
{% set minrank = 80 %}
|
||||||
|
{% for r in ranges %}
|
||||||
|
{% if r.rank is not none and r.rank+20 > minrank %}
|
||||||
|
{% set minrank = r.rank+20 %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
|
||||||
|
<table class="list">
|
||||||
|
{% for t in ranges %}
|
||||||
|
|
||||||
|
{% set thisrange = t.range %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ thisrange.desc() }}</td>
|
||||||
|
<td class="rank">
|
||||||
|
{{ '#' + t.rank.__str__() if t.rank is not none else 'n/a' }}
|
||||||
|
</td>
|
||||||
|
<td class="chart">
|
||||||
|
{% set prct = ((minrank+1-t.rank)*100/minrank if t.rank is not none else 0) %}
|
||||||
|
{{ htmlgenerators.rankLink(thisrange.urikeys(),percent=prct,medal=t.rank,**filterkeys) }}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
{%- endmacro %}
|
29
maloja/web/jinja/partials/pulse.jinja
Normal file
29
maloja/web/jinja/partials/pulse.jinja
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
{% macro pulse(filterkeys,limitkeys,delimitkeys,amountkeys) %}
|
||||||
|
|
||||||
|
{% set ranges = dbp.get_pulse(filterkeys,limitkeys,delimitkeys) %}
|
||||||
|
|
||||||
|
{% set maxbar = 1 %}
|
||||||
|
{% for r in ranges %}
|
||||||
|
{% if r.scrobbles > maxbar %}
|
||||||
|
{% set maxbar = r.scrobbles %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<table class="list">
|
||||||
|
{% for t in ranges %}
|
||||||
|
|
||||||
|
{% set thisrange = t.range %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ thisrange.desc() }}</td>
|
||||||
|
<td class="amount">
|
||||||
|
{{ htmlgenerators.scrobblesLink(thisrange.urikeys(),amount=t.scrobbles,**filterkeys) }}
|
||||||
|
</td>
|
||||||
|
<td class="bar">
|
||||||
|
{{ htmlgenerators.scrobblesLink(thisrange.urikeys(),percent=t.scrobbles*100/maxbar,**filterkeys) }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
{%- endmacro %}
|
24
maloja/web/jinja/partials/scrobbles.jinja
Normal file
24
maloja/web/jinja/partials/scrobbles.jinja
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
{% macro scrobbles(filterkeys,limitkeys,amountkeys) %}
|
||||||
|
|
||||||
|
{% set scrobbles = dbp.get_scrobbles(filterkeys,limitkeys,amountkeys) %}
|
||||||
|
|
||||||
|
{% set firstindex = amountkeys.page * amountkeys.perpage %}
|
||||||
|
{% set lastindex = firstindex + amountkeys.perpage %}
|
||||||
|
|
||||||
|
{% import 'snippets/entityrow.jinja' as entityrow %}
|
||||||
|
|
||||||
|
|
||||||
|
<table class='list'>
|
||||||
|
{% for s in scrobbles %}
|
||||||
|
{% if loop.index0 > firstindex and loop.index0 < lastindex %}
|
||||||
|
<tr>
|
||||||
|
<td class='time'>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
{{ entityrow.row(s) }}
|
||||||
|
</tr>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
{%- endmacro %}
|
16
maloja/web/jinja/snippets/entityrow.jinja
Normal file
16
maloja/web/jinja/snippets/entityrow.jinja
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{% macro row(entity,counting=[]) %}
|
||||||
|
|
||||||
|
{% if "artists" in entity %}
|
||||||
|
<td class='track'>
|
||||||
|
<span class='artist_in_trackcolumn'>{{ htmlgenerators.html_links(entity.artists) }}</span> – {{ htmlgenerators.html_link(entity) }}
|
||||||
|
</td>
|
||||||
|
{% else %}
|
||||||
|
<td class='artist'>{{ htmlgenerators.html_link(entity) }}
|
||||||
|
{% if counting != [] %}
|
||||||
|
<span class='extra'>incl. {{ htmlgenerators.html_links(counting) }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% endmacro %}
|
Loading…
Reference in New Issue
Block a user