Merge branch 'master' of atrey.karlin.mff.cuni.cz:/akce/MaM/MaMweb/mamweb

This commit is contained in:
Tomas "Jethro" Pokorny 2015-12-06 23:33:17 +01:00
commit f309affdd8
5 changed files with 85 additions and 33 deletions

View file

@ -3,6 +3,9 @@
from galerie.models import Obrazek, Galerie from galerie.models import Obrazek, Galerie
from django.contrib import admin from django.contrib import admin
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django import forms
from django.db import models
import autocomplete_light
# akction # akction
@ -27,17 +30,25 @@ def prepnout_fotogalerii_do_org_rezimu(modeladmin, request, queryset):
'Přepnout do režimu úprav (zneveřejní galerii)' 'Přepnout do režimu úprav (zneveřejní galerii)'
class GalerieInline(admin.TabularInline): class GalerieInline(admin.TabularInline):
model = Obrazek model = Obrazek
fields = ['obrazek_velky', 'nazev', 'popis', 'obrazek_maly_tag']
readonly_fields = ['nazev', 'obrazek_maly_tag']
formfield_overrides = {
models.TextField: {'widget': forms.TextInput},
}
class ObrazekAdmin(admin.ModelAdmin): class ObrazekAdmin(admin.ModelAdmin):
list_display = ('obrazek_velky', 'nazev', 'popis') list_display = ('obrazek_velky', 'nazev', 'popis', 'obrazek_maly_tag')
class GalerieAdmin(admin.ModelAdmin): class GalerieAdmin(admin.ModelAdmin):
model = Galerie form = autocomplete_light.modelform_factory(Galerie, autocomplete_fields=['titulni_obrazek'], fields=['titulni_obrazek'])
fields = ('zobrazit', 'nazev', 'titulni_obrazek', 'popis', 'galerie_up', 'soustredeni', 'poradi') model = Galerie
list_display = ('nazev', 'pk', 'datum_zmeny', 'zobrazit', 'soustredeni') fields = ('zobrazit', 'nazev', 'titulni_obrazek', 'popis', 'galerie_up', 'soustredeni', 'poradi')
inlines = [GalerieInline] list_display = ('nazev', 'pk', 'poradi', 'datum_zmeny', 'zobrazit', 'soustredeni')
actions = [zverejnit_fotogalerii, prepnout_fotogalerii_do_org_rezimu] inlines = [GalerieInline]
actions = [zverejnit_fotogalerii, prepnout_fotogalerii_do_org_rezimu]
save_on_top = True
ordering = ['galerie_up__nazev', 'poradi']
admin.site.register(Obrazek, ObrazekAdmin) admin.site.register(Obrazek, ObrazekAdmin)
admin.site.register(Galerie, GalerieAdmin) admin.site.register(Galerie, GalerieAdmin)

View file

@ -0,0 +1,49 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import autocomplete_light
from models import Obrazek, Galerie
from views import cesta_od_korene
class ObrazekAutocomplete(autocomplete_light.AutocompleteModelBase):
model = Obrazek
search_fields = ['nazev', 'popis']
split_words = True
limit_choices = 15
attrs = {
# This will set the input placeholder attribute:
'placeholder': u'Obrázek',
# This will set the yourlabs.Autocomplete.minimumCharacters
# options, the naming conversion is handled by jQuery
'data-autocomplete-minimum-characters': 1,
}
choice_html_format = '''
<span class="block" data-value="{}">
<span class="block">
{}
<span class="block">{}</span>
</span>
</span>
'''
def choice_label(self, obrazek):
cesta = "/".join(g.nazev for g in cesta_od_korene(obrazek.galerie))
popis = "{}<br>".format(obrazek.popis) if obrazek.popis else ""
return '{}<br>{}{}'.format(obrazek.nazev, popis, cesta)
def choice_html(self, obrazek):
"""Vrátí kus html i s obrázkem, které se pak ukazuje v nabídce"""
return self.choice_html_format.format(self.choice_value(obrazek),
obrazek.obrazek_maly_tag(), self.choice_label(obrazek))
widget_attrs={
'data-widget-maximum-values': 15,
'class': 'modern-style',
}
autocomplete_light.register(ObrazekAutocomplete)

View file

@ -56,6 +56,12 @@ class Obrazek(models.Model):
verbose_name = 'Obrázek' verbose_name = 'Obrázek'
verbose_name_plural = 'Obrázky' verbose_name_plural = 'Obrázky'
ordering = ['nazev'] ordering = ['nazev']
def obrazek_maly_tag(self):
return u'<img src="{}">'.format(self.obrazek_maly.url)
obrazek_maly_tag.short_description = "Náhled"
obrazek_maly_tag.allow_tags = True
class Galerie(models.Model): class Galerie(models.Model):

View file

@ -22,23 +22,9 @@ M&amp;M je korespondeční seminář. Několikrát do roka zdarma vydáváme ča
<div class="odpocet"> <div class="odpocet">
<p><b>Do konce <a href="https://mam.mff.cuni.cz/zadani/aktualni/">odeslání řešení</a> zbývá:<br> <p><b>Do konce <a href="https://mam.mff.cuni.cz/zadani/aktualni/">odeslání řešení</a> zbývá:<br>
<big>{{ted|timesince:dead}}</big></b></p> <big>{{ted|timesince:dead}}</big></b></p>
<!--
{{cas_do_konce_dni}} dní
{% if cas_do_konce_dni < 5 %}
{{cas_do_konce_hodin}} hodin
{% if cas_do_konce_hodin < 5 %}
{{cas_do_konce_minut}} minut
{% if cas_do_konce_minut < 5 %}
{{cas_do_konce_sekund}}
{% endif %}
{% endif %}
{% endif %}
-->
</div> </div>
{% endif %} {% endif %}
{# Novinky #} {# Novinky #}
<h2>Novinky</h2> <h2>Novinky</h2>
{% include 'seminar/novinky.html' %} {% include 'seminar/novinky.html' %}

View file

@ -73,16 +73,16 @@ class TitulniStranaView(generic.ListView):
context = super(TitulniStranaView, self).get_context_data(**kwargs) context = super(TitulniStranaView, self).get_context_data(**kwargs)
nastaveni = get_object_or_404(Nastaveni) nastaveni = get_object_or_404(Nastaveni)
cas_deadline = nastaveni.aktualni_cislo.datum_deadline cas_deadline = nastaveni.aktualni_cislo.datum_deadline
try: # Pokud neni zverejnene cislo nezverejnuj odpocet
rozdil_casu = datetime.combine(cas_deadline, datetime.max.time()) \ if nastaveni.aktualni_cislo.verejne():
- datetime.now() # pokus se zjistit termin odeslani a pokud neni zadany,
context['cas_do_konce_dni'] = rozdil_casu.days # nezverejnuj odpocet
context['cas_do_konce_hodin'] = rozdil_casu.seconds / 3600 try:
context['cas_do_konce_minut'] = (rozdil_casu.seconds / 60) % 60 context['dead'] = datetime.combine(cas_deadline, datetime.max.time())
context['cas_do_konce_sekund'] = rozdil_casu.seconds % 60 context['ted'] = datetime.now()
context['dead'] = datetime.combine(cas_deadline, datetime.max.time()) except:
context['ted'] = datetime.now() context['dead'] = None
except: else:
context['dead'] = None context['dead'] = None
return context return context