# -*- encoding: utf-8 -*- # Macro d'affichage des pages perso # Update par Chirac : cette macro n'utilise plus le .info dans les home # A la place, une table dans la base pg gérée par django coté intranet # Désormais, seules les pages perso référencées dans la base sont affichées # Le référencement constitue un choix volontaire, de l'utilisateur via l'intranet import os import psycopg2 _conn = None def _get_conn(): global _conn if not _conn: _conn = psycopg2.connect(database="django", user="crans_ro", host="pgsql.adm.crans.org") return _conn class AccountList: home = "/home" www = "www" url = "http://perso.crans.org/%s/" def __init__(self): return def comptes(self): """Retourne la liste des comptes""" #Désormais, seuls les pages perso qui sont dans la base sont référencées. con = _get_conn() cur = con.cursor() cur.execute("SELECT login FROM pageperso_pageperso") return cur.fetchall() def makeAnchor(self,letter): return u"
%s:
" % ( letter, letter ) def makeIndex(self,letter_list): index = u'' for aLetter in letter_list: index = u"%s%s" % ( index, aLetter, aLetter) return u"
%s
" % index def to_html(self): dirs = self.comptes() dirs.sort() html = u"" premiere_lettre = '' letter_list = [] for d in dirs: d=d[0] if premiere_lettre != d[0]: premiere_lettre = d[0] letter_list.append(premiere_lettre) html = u"%s\n%s" % ( html, self.makeAnchor(premiere_lettre) ) html = u"%s\n%s" % (html, Account(self.home, d, self.www, self.url).to_html()) index = self.makeIndex(letter_list) html = index + html html += u'
' return html class Account: """Classe représentant la page perso d'une personne""" _connexion = None def __init__(self, home, login, www, url): """Instanciation avec le `login' de la personne""" self.login = login self.home = "%s/%s" % (home, login) self.www = www self.url = url _info = None def info(self, champ): """Retourne le contenu du champ `champ' dans le fichier info""" if self._info == None: self._info = dict() con = _get_conn() cur = con.cursor() cur.execute("SELECT * FROM pageperso_pageperso WHERE login='%s' " % self.login ) data = cur.fetchall() if data: for indice,item in enumerate(data[0]): self._info[cur.description[indice][0]]=item.decode('utf-8') if self._info.has_key(champ.lower()): return self._info[champ.lower()] else: return u"" def chemin(self): """Chemin vers le www""" return os.path.join(self.home, self.www) def logo(self): """URL du logo s'il y en a un""" if self.info("logo"): # Le logo peut être en absolu ou en relatif if self.info("logo").startswith(self.chemin()): logo = self.info("logo").replace("%s/" % self.chemin(), "") else: logo = self.info("logo") if os.path.isfile(os.path.join(self.chemin(), logo)): return u"%s%s" % (self.url % self.login, logo) return u"http://perso.crans.org/pageperso.png" def to_html(self): """Renvoie le code HTML correspondant au fichier .info""" if self.login.lower() not in self.info("nom_site").lower(): ident = u'%s
' % self.login else: ident = u'' html = [ u'
', u'' % (self.url % self.login), u'%s' % (self.logo(), self.login), u'
', self.info("nom_site") and u'%s
' % self.info("nom_site") or u'', ident, self.info("slogan") and u'%s' % self.info("slogan") or u'', u'
' ] return u'\n'.join(html) def execute(macro, args): return macro.formatter.rawHTML(AccountList().to_html())