Posts avec le tag "widget"

Widget "Calendar"

Ajouté le 26.03.2010 - 09:47 dans  •  Commentaires (0)
Tags: pylons calendar widget

Comme indiqué dans un précédent post, j'ai dû refaire mon widget calendar suite à la migration à postgresql-8.4.

Voici comment il fonctionne, avec 2-3 bouts de codes pouvant être utiles à d'autres (oupa ;) )

Je me suis arrangé pour tout faire faire par Mako. On va donc commencer par là ;)

##-*- coding: utf-8 -*-
<%
import datetime
import time
import calendar
import sqlalchemy

year  = int(c.year)
month = int(c.month)

today = datetime.date(year, month, 10)


months = ["", "Janvier", u"Février", "Mars", "Avril", "Mai", "Juin", "Juillet", u"Août", "Septembre", "Octobre", "Novembre", u"Décembre"]
days = ["Lu", "Ma", "Me", "Je", "Ve", "Sa", "Di"]

calObj = calendar.Calendar(0)
cal = calObj.monthdays2calendar(year, month)

%>
<!-- calendar widget -->
<table summary="Calendar">
  <caption>${months[month]} ${year}</caption>
  <thead>
    <tr>
      % for day in days :
        <th scope="col">${day}</th>
      % endfor
    </tr>
  </thead>
  <tfoot>
    <%
    previous_year = (today - datetime.timedelta(weeks=4)).year
    previous_month = (today - datetime.timedelta(weeks=4)).month
    next_year = (today + datetime.timedelta(weeks=4)).year
    next_month = (today + datetime.timedelta(weeks=4)).month
    %>
    <td colspan="2" id="prev"><a href="/blog/cal/${previous_year}/${previous_month}" title="${months[previous_month]} ${previous_year}">&lt;&lt;</a></td>
    <td colspan="3" class="center"><a href="/blog/">Aujourd'hui</a></td>
    <td colspan="2" id="next" class="right"><a href="/blog/cal/${next_year}/${next_month}" title="${months[next_month]} ${next_year}">&gt;&gt;</a></td>
  </tfoot>
%for week in cal:
  <tr>
  %for day in week:
    <% day,dweek = day %>
    %if day > 0 :
      <% posts = c.post_cal.filter( sqlalchemy.sql.expression.cast(c.content.time, sqlalchemy.types.DATE) == datetime.date(year, month, day)).count() %>

      %if posts > 0:
      <td class="bold"><a href="/blog/see/${year}/${month}/${day}" title="${posts} post(s)">${day}</a></td>
      %else:
      <td>${day}</td>
      %endif
    %else:
      <td></td>
    %endif
  %endfor
  </tr>
%endfor

</table>


Explications :
import datetime
import calendar
import sqlalchemy

year  = int(c.year)
month = int(c.month)

today = datetime.date(year, month, 10)


months = ["", "Janvier", u"Février", "Mars", "Avril", "Mai", "Juin", "Juillet", u"Août", "Septembre", "Octobre", "Novembre", u"Décembre"]
days = ["Lu", "Ma", "Me", "Je", "Ve", "Sa", "Di"]

calObj = calendar.Calendar(0)
cal = calObj.monthdays2calendar(year, month)

Cette partie importe quelques librairies utiles et initialise quelques variables - comme vous pouvez le constater, c'est simple. Le "today" correspond à ce qu'on est effectivement en train de regarder (genre avril 2009, par exemple). Il s'agit donc d'un "today" relatif ;).

previous_year = (today - datetime.timedelta(weeks=4)).year
previous_month = (today - datetime.timedelta(weeks=4)).month
next_year = (today + datetime.timedelta(weeks=4)).year
next_month = (today + datetime.timedelta(weeks=4)).month

Là, c'est simple : je demande à Python de me sortir le mois précédent/suivant, ainsi que l'année précédente/suivante en fonction du mois actuellement vu.
Cette partie sert pour les liens << et >> (aka mois précédent, mois suivant).

%for week in cal:
  <tr>
  %for day in week:
    <% day,dweek = day %>
    %if day > 0 :
      <% posts = c.post_cal.filter( sqlalchemy.sql.expression.cast(c.content.time, sqlalchemy.types.DATE) == datetime.date(year, month, day)).count() %>

      %if posts > 0:
      <td class="bold"><a href="/blog/see/${year}/${month}/${day}" title="${posts} post(s)">${day}</a></td>
      %else:
      <td>${day}</td>
      %endif
    %endif
  %endfor
  </tr>
%endfor

Là, on boucle simplement dans les semaines et les jours du calendrier. J'ai "donné" au template la liste de mes posts, et il lui suffit de filtrer en fonction de la date. Et c'est tout ;).

Petite précision : c.content est en fait l'objet Content, définit dans le modèle sqlalchemy. J'aurais pu faire un importe de plus dans le template, après réflexion.

Voilà.. tout simple, et ça marche pas trop mal ;).

Happy coding

Tengu

Lire plus