# -*- coding: utf-8 -*- from trac.core import * from trac.perm import PermissionSystem from trac.db import Table, Column, Index from trac.db.util import sql_escape_percent from datetime import datetime, timedelta from trac.util.datefmt import utc, to_timestamp from trac.util.text import to_unicode from trac.env import IEnvironmentSetupParticipant from ctdotools.utils import validate_id, gen_wiki_page from dateutil.rrule import * from collections import defaultdict from tracrendezvous.location.model import ItemLocation as RendezVousLocation from tracrendezvous.rendezvous import api __all__ = ['RendezVous', 'RendezVousComment', 'RendezVousType', 'RendezVousDate', 'RendezVousVote', 'TypePermission', 'RendezVousModelProvider', 'RendezVousTypePermissionSystem'] class RendezVousVote(object): def __init__(self, env, vote_id, date_id, user, email, time_created, time_begin, time_end): self.env = env self.vote_id = vote_id self.date_id = date_id self.user = to_unicode(user) self.email = to_unicode(email) self.time_created = time_created self.time_begin = time_begin self.time_end = time_end @staticmethod def fetch_one(env, vote_id): db = env.get_db_cnx() cursor = db.cursor() cursor.execute("""SELECT * FROM rendezvous_vote WHERE vote_id=%s""", (vote_id,)) row = cursor.fetchone() if not row: return None vote_id, date_id, user, email, time_created, time_begin, time_end = row return RendezVousVote(env, vote_id, date_id, user, email, datetime.fromtimestamp(time_created, utc), datetime.fromtimestamp(time_begin, utc), datetime.fromtimestamp(time_end, utc)) @staticmethod def exists(env, date_id, user, time_begin, time_end): db = env.get_db_cnx() cursor = db.cursor() cursor.execute("""SELECT COUNT(*) FROM rendezvous_vote WHERE date_id=%s and user=%s and time_begin=%s and time_end=%s""", (date_id, user, to_timestamp(time_begin), to_timestamp(time_end))) row = cursor.fetchone() return row[0] > 0 @staticmethod def fetch_by_date(env, date_id, userName=None): db = env.get_db_cnx() cursor = db.cursor() if userName == None: cursor.execute("""SELECT * FROM rendezvous_vote WHERE date_id=%s ORDER BY user""", (date_id,)) else: cursor.execute("""SELECT * FROM rendezvous_vote WHERE date_id=%s and user=%s ORDER BY user;""", (date_id, userName)) res = [] for row in cursor: vote_id, date_id, user, email, time_created, time_begin, time_end = row res.append(RendezVousVote(env, vote_id, date_id, user, email, datetime.fromtimestamp(time_created, utc), datetime.fromtimestamp(time_begin, utc), datetime.fromtimestamp(time_end, utc))) return res def commit(self): db = self.env.get_db_cnx() cursor = db.cursor() cursor.execute("""INSERT INTO rendezvous_vote (date_id, user, email, time_created, time_begin, time_end) VALUES(%s, %s, %s, %s, %s, %s)""", ( self.date_id, self.user, self.email, to_timestamp(self.time_created), to_timestamp(self.time_begin), to_timestamp(self.time_end))) db.commit() self.vote_id = db.get_last_id(cursor, 'rendezvous_vote') @staticmethod def delete(env, vote_id): db = env.get_db_cnx() cursor = db.cursor() cursor.execute("""DELETE FROM rendezvous_vote WHERE vote_id =%s;""", (vote_id,)) db.commit() @staticmethod def delete_by_date(env, date_id): db = env.get_db_cnx() cursor = db.cursor() cursor.execute("""DELETE FROM rendezvous_vote WHERE date_id =%s;""", (date_id,)) db.commit() def update(self): db = self.env.get_db_cnx() cursor = db.cursor() cursor.execute("""UPDATE rendezvous_vote SET user=%s, email=%s, time_created=%s, time_begin=%s, time_end=%s WHERE vote_id=%s;""", (self.user, self.email, to_timestamp(self.time_created), to_timestamp(self.time_begin), to_timestamp(self.time_end), self.vote_id)) db.commit() def __str__(self): return " 0: cursor.execute("""SELECT * FROM rendezvous_date WHERE date_id=%s""", (date_id,) ) row = cursor.fetchone() if not row: return None date_id, rendezvous_id, author, email, time_created, time_begin, time_end, elected = row return RendezVousDate(env, date_id, rendezvous_id, author, email, datetime.fromtimestamp(time_created, utc), datetime.fromtimestamp(time_begin, utc), datetime.fromtimestamp(time_end, utc), elected, fetch_votes) @staticmethod def exists(env, ts_begin, ts_end): db = env.get_db_cnx() cursor = db.cursor() cursor.execute("SELECT date_id " "FROM rendezvous_date " "WHERE time_begin=%s AND time_end = %s", (to_timestamp(ts_begin), to_timestamp(ts_end))) rows = cursor.fetchall() return bool(rows) @staticmethod def fetch_by_rendezvous(env, rendezvous_id, fetch_votes=True): db = env.get_db_cnx() cursor = db.cursor() cursor.execute("""SELECT * FROM rendezvous_date WHERE rendezvous_id=%s;""", (rendezvous_id,) ) rows = cursor.fetchall() res = [] for row in rows: date_id, rendezvous_id, author, email, time_created, time_begin, time_end, elected= row res.append(RendezVousDate(env, date_id, rendezvous_id, author, email, datetime.fromtimestamp(time_created, utc), datetime.fromtimestamp(time_begin, utc), datetime.fromtimestamp(time_end, utc), elected, fetch_votes)) return res @staticmethod def fetch_all(env, fetch_votes=True): db = env.get_db_cnx() cursor = db.cursor() cursor.execute("SELECT * FROM rendezvous_date;") rows = cursor.fetchall() res = [] for row in rows: date_id, rendezvous_id, author, email, time_created, time_begin, time_end, elected = row res.append(RendezVousDate(env, date_id, rendezvous_id, author, email, datetime.fromtimestamp(time_created, utc), datetime.fromtimestamp(time_begin, utc), datetime.fromtimestamp(time_end, utc), elected, fetch_votes)) return res def get_vote_count(self, authname=None): db = self.env.get_db_cnx() cursor = db.cursor() if authname: cursor.execute("""SELECT COUNT(rendezvous_date.date_id) from rendezvous_date INNER JOIN rendezvous_vote ON rendezvous_date.date_id=rendezvous_vote.date_id where rendezvous_date.date_id=%s and rendezvous_vote.user=%s;""", (self.date_id, authname)) else: cursor.execute("SELECT COUNT(rendezvous_date.date_id) from rendezvous_date INNER JOIN rendezvous_vote " "ON rendezvous_date.date_id=rendezvous_vote.date_id " "where rendezvous_date.date_id=%s;", (self.date_id,)) row = cursor.fetchone() if row: return row[0] return 0 def commit(self, conn=None): db = conn and conn or self.env.get_db_cnx() cursor = db.cursor() cursor.execute("""INSERT INTO rendezvous_date (rendezvous_id, author, email, time_created, time_begin, time_end, elected) VALUES(%s,%s,%s,%s,%s,%s,%s)""", ( self.rendezvous_id, self.author, self.email, to_timestamp(self.time_created), to_timestamp(self.time_begin), to_timestamp(self.time_end), self.elected)) db.commit() self.date_id = db.get_last_id(cursor, 'rendezvous_date') @staticmethod def delete(env, date_id): db = env.get_db_cnx() cursor = db.cursor() cursor.execute("DELETE FROM rendezvous_date WHERE date_id=%s", (date_id,)) db.commit() @staticmethod def delete_by_rendezvous(env, rendezvous_id): db = env.get_db_cnx() cursor = db.cursor() cursor.execute("""DELETE FROM rendezvous_date WHERE rendezvous_id=%s;""", (rendezvous_id,) ) db.commit() def update(self, conn=None): db = conn and conn or self.env.get_db_cnx() cursor = db.cursor() try: cursor.execute("""UPDATE rendezvous_date SET rendezvous_id=%s, author=%s, email=%s, time_created=%s, time_begin=%s, time_end=%s, elected=%s WHERE date_id=%s""", (self.rendezvous_id, self.author, self.email, to_timestamp(self.time_created), to_timestamp(self.time_begin), to_timestamp(self.time_end), self.elected, self.date_id)) if not conn: db.commit() except Exception: pass def __str__(self): return "" % (self.date_id, self.rendezvous_id, self.author, self.email, str(self.time_created), str(self.time_begin), str(self.time_end), self.elected) class RendezVousComment(object): def __init__(self, env, comment_id, rendezvous_id, author, comment, time_created): self.env = env self.comment_id = comment_id self.rendezvous_id = rendezvous_id self.author = to_unicode(author) self.comment = to_unicode(comment) self.time_created = time_created @staticmethod def fetch_one(env, comment_id): db = env.get_db_cnx() cursor = db.cursor() if int(comment_id) > 0: cursor.execute("SELECT * " "FROM rendezvous_comment " "WHERE comment_id=%s", (comment_id,) ) row = cursor.fetchone() if not row: return None comment_id, rendezvous_id, author, comment, time_created = row return RendezVousComment(env, comment_id, rendezvous_id, author, comment, datetime.fromtimestamp(time_created, utc)) @staticmethod def fetch_by_rendezvous(env, rendezvous_id): db = env.get_db_cnx() cursor = db.cursor() cursor.execute("""SELECT * FROM rendezvous_comment WHERE rendezvous_id=%s;""", (rendezvous_id,) ) rows = cursor.fetchall() res = [] for row in rows: comment_id, rendezvous_id, author, comment, time_created = row res.append(RendezVousComment(env, comment_id, rendezvous_id, author, comment, datetime.fromtimestamp(time_created, utc))) return res @staticmethod def fetch_all(env): db = env.get_db_cnx() cursor = db.cursor() cursor.execute("SELECT * FROM rendezvous_comment;") rows = cursor.fetchall() res = [] for row in rows: comment_id, rendezvous_id, author, comment, time_created = row res.append(RendezVousComment(env, comment_id, rendezvous_id, author, comment, datetime.fromtimestamp(time_created, utc))) return res def commit(self): db = self.env.get_db_cnx() cursor = db.cursor() cursor.execute("""INSERT INTO rendezvous_comment (rendezvous_id, author, comment, time_created) VALUES(%s,%s,%s,%s)""", ( self.rendezvous_id, self.author, self.comment, to_timestamp(self.time_created))) db.commit() self.comment_id = db.get_last_id(cursor, 'rendezvous_comment') @staticmethod def delete(env, comment_id): db = env.get_db_cnx() RendezVousVote.delete_by_date(env, comment_id) cursor = db.cursor() cursor.execute("DELETE FROM rendezvous_comment WHERE comment_id=%s", (comment_id,)) db.commit() @staticmethod def delete_by_rendezvous(env, rendezvous_id): db = env.get_db_cnx() cursor = db.cursor() cursor.execute("DELETE FROM rendezvous_comment WHERE rendezvous_id=%s", (rendezvous_id,)) db.commit() def update(self): db = self.env.get_db_cnx() cursor = db.cursor() try: cursor.execute("""UPDATE rendezvous_comment SET rendezvous_id=%s, author=%s, comment=%s, time_created=%s WHERE comment_id=%s""", (self.rendezvous_id, self.author, self.comment, to_timestamp(self.time_created), self.comment_id)) db.commit() except Exception: pass def __str__(self): return "" % (self.comment_id, self.rendezvous_id, self.author, self.comment, str(self.time_created)) class RendezVousType(object): def __init__(self, env, type_id, name): self.env = env self.type_id = type_id self.name = to_unicode(name) self.typePermissions = TypePermission.fetch(env, type_id) @staticmethod def fetch_one(env, type_id=None, name=None): db = env.get_db_cnx() cursor = db.cursor() if type_id and type_id > 0: validate_id(int(type_id)) cursor.execute("""SELECT * FROM rendezvous_type WHERE type_id=%s""", (type_id,)) else: cursor.execute("""SELECT * FROM rendezvous_type WHERE name=%s""", (name,)) row = cursor.fetchone() if row: return RendezVousType(env, row[0], row[1]) return None @staticmethod def fetch_all(env): db = env.get_db_cnx() cursor = db.cursor() cursor.execute("SELECT * FROM rendezvous_type") rows = cursor.fetchall() if not rows: return [] res = [] for row in rows: res.append(RendezVousType(env, row[0], row[1])) return res def commit(self): db = self.env.get_db_cnx() cursor = db.cursor() cursor.execute("""INSERT INTO rendezvous_type (name) VALUES(%s)""", (self.name,)) db.commit() self.type_id = db.get_last_id(cursor, 'rendezvous_type') def has_permission(self, permission): for i in self.typePermissions: if i.permission == permission: return True return False def delete(self): db = self.env.get_db_cnx() cursor = db.cursor() TypePermission.delete_by_type(self.env, self.type_id) cursor.execute("DELETE FROM rendezvous_type WHERE type_id=%s", (self.type_id,)) db.commit() def update(self): db = self.env.get_db_cnx() cursor = db.cursor() cursor.execute("""UPDATE rendezvous_time SET name=%s WHERE type_id=%s""", (self.name, self.type_id)) db.commit() class TypePermission(object): def __init__(self, env, type_id, permission): self.env = env self.type_id = type_id self.permission = permission @staticmethod def fetch(env, type_id): db = env.get_db_cnx() cursor = db.cursor() cursor.execute("""SELECT * FROM rendezvous_type_to_permission WHERE type_id=%s""", (type_id,) ) rows = cursor.fetchall() if not rows: return [] res = [] for row in rows: res.append(TypePermission(env, row[0], row[1])) return res @staticmethod def fetch_one(env, type_id, permission): db = env.get_db_cnx() cursor = db.cursor() if int(type_id) > 0: cursor.execute("""SELECT * FROM rendezvous_type_to_permission WHERE type_id=%s AND permission=%s""", (type_id, permission)) row = cursor.fetchone() if row: return TypePermission(env, row[0], row[1]) return None @staticmethod def delete_by_type(env, type_id): db = env.get_db_cnx() cursor = db.cursor() cursor.execute("DELETE FROM rendezvous_type_to_permission WHERE type_id=%s", (type_id,)) db.commit() def commit(self): db = self.env.get_db_cnx() cursor = db.cursor() cursor.execute("""INSERT INTO rendezvous_type_to_permission (type_id, permission) VALUES(%s,%s)""", (self.type_id, self.permission)) db.commit() def delete(self): db = self.env.get_db_cnx() cursor = db.cursor() cursor.execute("DELETE FROM rendezvous_type_to_permission WHERE type_id=%s AND permission=%s", (self.type_id, self.permission)) db.commit() def __str__(self): return "" % (self.type_id, self.permission) class RendezVous(object): def __init__(self, env, fetch_dates, rendezvous_id, name, author, email, description, time_created, schedule_deadline, min_votes, type_id, status, location_id, is_date_fixed, tags): self.env = env self.rendezvous_id = rendezvous_id self.name = to_unicode(name) self.author = to_unicode(author) self.email = to_unicode(email) self.description = to_unicode(description) self.time_created = time_created self.schedule_deadline = schedule_deadline self.min_votes = min_votes self.type_id = type_id t = RendezVousType.fetch_one(self.env, type_id) self.type_name = t and t.name or None self.status = to_unicode(status) self.location_id = location_id self.is_date_fixed = is_date_fixed self.dates = [] self.tags = tags self.elected = 0 if fetch_dates: self.dates = RendezVousDate.fetch_by_rendezvous(env, self.rendezvous_id) for i in self.dates: if i.elected: self.elected = i.date_id @staticmethod def fetch_one(env, rid=None, name=None, fetch_dates=False): db = env.get_db_cnx() cursor = db.cursor() rendezvous_id=0 if rid: rendezvous_id = int(rid) validate_id(rendezvous_id) cursor.execute("""SELECT * FROM rendezvous WHERE rendezvous_id=%s""", (rendezvous_id,)) if name: myname = unicode(name) cursor.execute("""SELECT * FROM rendezvous WHERE name=%s""", name) row = cursor.fetchone() if not row: return None rendezvous_id, name, author, email, description, time_created, schedule_deadline, min_votes, type_id, status, location_id, is_date_fixed, tags = row return RendezVous(env, fetch_dates, rendezvous_id, name, author, email, description, datetime.fromtimestamp(time_created, utc), datetime.fromtimestamp(schedule_deadline, utc), min_votes, type_id, status, location_id, is_date_fixed, tags) @staticmethod def _fetch_some(env, fetch_dates, query, *args): db = env.get_db_cnx() cursor = db.cursor() if args: cursor.execute(query, args) else: cursor.execute(query) rows = cursor.fetchall() if not rows: return [] res = [] for row in rows: rendezvous_id, name, author, email, description, time_created, schedule_deadline, min_votes, type_id, status, location_id, is_date_fixed, tags = row res.append( RendezVous(env, fetch_dates, rendezvous_id, name, author, email, description, datetime.fromtimestamp(time_created, utc), datetime.fromtimestamp(schedule_deadline, utc), min_votes, type_id, status, location_id, is_date_fixed, tags)) return res def get_date(self, date_id): for i in self.dates: if i.date_id == date_id: return i raise ValueError("RendezVousDate not found in RendezVous") @staticmethod def fetch_all(env, fetch_dates=False, sort=None): if not sort: return RendezVous._fetch_some(env, fetch_dates, "SELECT * FROM rendezvous;") return RendezVous._fetch_some(env, fetch_dates, "SELECT * FROM rendezvous ORDER BY name") @staticmethod def my_rendezvous(env, name): return RendezVous._fetch_some(env, False, "SELECT * FROM rendezvous where author = %s;", name) @staticmethod def exists(env, rendezvous_id=0): db = env.get_db_cnx() cursor = db.cursor() if int(rendezvous_id) <= 0: return False cursor.execute("""SELECT * FROM 'rendezvous' WHERE rendezvous_id=%s""", (rendezvous_id,)) row = cursor.fetchone() return row != None def has_voted(self, authname=None): for date in self.dates: for vote in date.votes: if vote.user == authname: return True return False def has_votes(self): for date in self.dates: if date.votes: return True return False def commit(self): db = self.env.get_db_cnx() t = datetime.now(utc) cursor = db.cursor() cursor.execute( "INSERT INTO rendezvous " "(name,author,email,description,time_created,schedule_deadline,min_votes,type_id,status,location_id,is_date_fixed,tags) " "VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)", (self.name, self.author, self.email, self.description, to_timestamp(t), to_timestamp(self.schedule_deadline), self.min_votes, self.type_id, self.status, self.location_id, self.is_date_fixed, self.tags)) db.commit() self.rendezvous_id = db.get_last_id(cursor, 'rendezvous') @staticmethod def delete(env, rendezvous_id): db = env.get_db_cnx() cursor = db.cursor() cursor.execute("DELETE FROM rendezvous WHERE rendezvous_id = %s", (rendezvous_id,)) db.commit() def update(self): db = self.env.get_db_cnx() cursor = db.cursor() cursor.execute("UPDATE rendezvous " \ "SET name =%s, " \ "author=%s, " \ "email=%s, " \ "description=%s, " \ "time_created=%s, " \ "schedule_deadline=%s, " \ "min_votes=%s, " \ "type_id=%s, " \ "status=%s, " \ "location_id=%s, " \ "is_date_fixed=%s, " \ "tags=%s " \ "WHERE rendezvous_id=%s", (self.name, self.author, self.email, self.description, to_timestamp(self.time_created), to_timestamp(self.schedule_deadline), self.min_votes, self.type_id, self.status, self.location_id, self.is_date_fixed, self.tags, self.rendezvous_id)) db.commit() def __str__(self): return "" % (self.rendezvous_id, self.name, self.author, self.email, str(self.time_created)) class RendezVousModelProvider(Component): implements(IEnvironmentSetupParticipant) SCHEMA = [ # rendezvous system Table('rendezvous', key='rendezvous_id')[ Column('rendezvous_id', auto_increment=True), Column('name'), Column('author'), Column('email'), Column('description'), Column('time_created', type='int'), Column('schedule_deadline', type='int'), Column('min_votes', type='int'), Column('type_id', type='int'), Column('status'), Column('location_id', type='int'), Column('is_date_fixed', type='int'), Column('tags'), Index(['name']), Index(['status']) ], Table('rendezvous_comment', key='comment_id')[ Column('comment_id', auto_increment=True), Column('rendezvous_id', type='int'), Column('author'), Column('comment'), Column('time_created', type='int')], # an user's spare time frame Table('rendezvous_date', key='id')[ Column('date_id', auto_increment=True), Column('rendezvous_id', type='int'), Column('author'), Column('email'), Column('time_created', type='int'), Column('time_begin', type='int'), Column('time_end', type='int'), Column('elected', type='int')], Table('rendezvous_type', key=["type_id"])[ Column("type_id", auto_increment=True), Column("name"), Index(["name"])], Table('rendezvous_type_to_permission', key=["type_id", "permission"])[ Column("type_id", type="int"), Column("permission")], # user's votings for a date with date and length of time frame Table('rendezvous_vote', key=['vote_id'])[ Column('vote_id', auto_increment=True), Column('date_id', type='int'), Column('user'), Column('email'), Column('time_created', type='int'), Column('time_begin', type='int'), Column('time_end', type='int'), Index(['time_begin']), Index(['time_end'])]] RendezVousDateTrigger = "CREATE TRIGGER fkd_date_rendezvous_id " \ "BEFORE DELETE ON rendezvous " \ "FOR EACH ROW BEGIN " \ "DELETE from rendezvous_date WHERE rendezvous_id = OLD.rendezvous_id; " \ "END;" RendezVousCommentTrigger = "CREATE TRIGGER fkd_comment_rendezvous_id " \ "BEFORE DELETE ON rendezvous " \ "FOR EACH ROW BEGIN " \ "DELETE from rendezvous_comment WHERE rendezvous_id = OLD.rendezvous_id; " \ "END;" RendezVousVoteTrigger = "CREATE TRIGGER fkd_vote_date_id " \ "BEFORE DELETE ON rendezvous_date " \ "FOR EACH ROW BEGIN " \ "DELETE from rendezvous_vote WHERE date_id = OLD.date_id; " \ "END;" TYPE_DATA = ( (u'public',), (u'admin',), (u'Offizieller Treff',), (u'Topic Treff',)) LOCATION_DATA = ( (u"CTDO, Langer August", "N", 51, 31, 39.4, "E", 7, 27, 53.8, 51.527611, 7.464922), (u"WILA, Langer August", "N", 51, 31, 39.4, "E", 7, 27, 53.8, 51.527611, 7.464922)) TYPE_PERMISSIONS_DATA = ( (1, u'RENDEZVOUS_VIEW'), (2, u'RENDEZVOUS_ADMIN')) def environment_created(self): if not "rendezvous" in self.config.sections(): data = {"graph_size_x" : 1024, "graph_size_y" : 300, "max_dates_per_rendezvous" : 99, "max_description_length" : 1024, "max_votes_per_date" : 99, "show_location_map" : True, "show_vote_graph" : True} for k, v in data.iteritems(): self.config.set("rendezvous", k, v) self.config.save() self._create_models(self.env.get_db_cnx()) def environment_needs_upgrade(self, db): """First version - nothing to migrate, but possibly to create. """ cursor = db.cursor() try: cursor.execute("select count(*) from rendezvous") cursor.fetchone() cursor.execute("select count(*) from rendezvous_date") cursor.fetchone() cursor.execute("select count(*) from rendezvous_comment") cursor.fetchone() cursor.execute("select count(*) from rendezvous_type") cursor.fetchone() cursor.execute("select count(*) from rendezvous_type_to_permission") cursor.fetchone() cursor.execute("select count(*) from rendezvous_vote") cursor.fetchone() return False except: db.rollback() return True def upgrade_environment(self, db): """ nothing to do here for now """ self._create_models(db) def _create_models(self, db): """Called when a new Trac environment is created.""" db_backend = None try: from trac.db import DatabaseManager db_backend, _ = DatabaseManager(self.env)._get_connector() except ImportError: db_backend = self.env.get_db_cnx() cursor = db.cursor() for table in self.SCHEMA: for stmt in db_backend.to_sql(table): self.env.log.debug(stmt) try: cursor.execute(stmt) db.commit() except Exception, e: self.env.log.warning(str(e)) db.rollback() cursor.execute(self.RendezVousCommentTrigger) cursor.execute(self.RendezVousDateTrigger) cursor.execute(self.RendezVousVoteTrigger) db.commit() #try: cursor.executemany("""INSERT INTO 'rendezvous_type' (name) VALUES(%s)""", self.TYPE_DATA) db.commit() class RendezVousTypePermissionSystem(Component): def check_user_type_permissions(self, user, type_id=None, name=None): ps = PermissionSystem(self.env).get_user_permissions(user) if 'RENDEZVOUS_ADMIN' in ps: return True t = RendezVousType.fetch_one(self.env, type_id=type_id, name=name) if not t: return False db = self.env.get_db_cnx() cursor = db.cursor() cursor.execute("""SELECT permission FROM rendezvous_type_to_permission WHERE type_id=%s""", (t.type_id,)) rows = cursor.fetchall() for p in rows: if not ps.has_key(p[0]): return False return True