예제 #1
0
파일: app.py 프로젝트: edgarcosta/seminars
 def static_fn():
     fn = os.path.join(os.path.dirname(os.path.abspath(__file__)), "static",
                       name)
     if os.path.exists(fn):
         return open(fn, "rb").read()
     critical("root_static_file: file %s not found!" % fn)
     return abort(404, "static file %s not found." % fn)
예제 #2
0
 def __init__(self,
              shortname,
              data=None,
              editing=False,
              showing=False,
              saving=False):
     if data is None and not editing:
         data = db.institutions.lookup(shortname, projection=3)
         if data is None:
             raise ValueError("Institution %s does not exist" % shortname)
     self.new = data is None
     if self.new:
         self.shortname = shortname
         self.type = "university"
         self.timezone = "US/Eastern"
         self.admin = current_user.email
         for key, typ in db.institutions.col_type.items():
             if key == "id" or hasattr(self, key):
                 continue
             elif typ == "text":
                 setattr(self, key, "")
             elif typ == "text[]":
                 setattr(self, key, [])
             else:
                 critical(
                     "Need to update institution code to account for schema change key=%s"
                     % key)
                 setattr(self, key, None)
     else:
         self.__dict__.update(data)
예제 #3
0
 def save(self, data):
     data = dict(data)  # copy
     email = data.pop("email", None)
     if not email:
         raise ValueError("data must contain email")
     user = self.lookup(email)
     if not user:
         raise ValueError("user does not exist")
     if not data:
         raise ValueError("no data to save")
     if "new_email" in data:
         data["email"] = data.pop("new_email")
         try:
             # standerdize email
             data["email"] = validate_email(data["email"])["email"]
         except EmailNotValidError as e:
             flash_error("""Oops, email '%s' is not allowed. %s""", data["email"], str(e))
             return False
         if self.user_exists(data["email"]):
             flash_error("There is already a user registered with email = %s", data["email"])
             return False
     for key in list(data):
         if key not in self.search_cols:
             if key != "id":
                 critical("Need to update pwdmanager code to account for schema change key=%s" % key)
             data.pop(key)
     with DelayCommit(db):
         if "email" in data:
             newemail = data["email"]
             db.institutions.update({"admin": ilike_query(email)}, {"admin": newemail})
             db.seminars.update({"owner": ilike_query(email)}, {"owner": newemail})
             db.seminar_organizers.update({"email": ilike_query(email)}, {"email": newemail})
             db.talks.update({"speaker_email": ilike_query(email)}, {"speaker_email": newemail})
         self.update({"email": ilike_query(email)}, data, restat=False)
     return True
예제 #4
0
 def __init__(
     self,
     seminar_id=None,
     seminar_ctr=None,
     data=None,
     seminar=None,
     editing=False,
     include_deleted=False,
     include_pending=False,
 ):
     if data is None and not editing:
         data = talks_lookup(seminar_id, seminar_ctr, include_deleted=include_deleted, include_pending=include_pending)
         if data is None:
             raise ValueError("Talk %s/%s does not exist" % (seminar_id, seminar_ctr))
         data = dict(data.__dict__)
     elif data is not None:
         data = dict(data)
         # avoid Nones
         if data.get("topics") is None:
             data["topics"] = []
     if data and data.get("deleted"):
         include_deleted = True
     if seminar is None:
         seminar = WebSeminar(seminar_id, include_deleted=include_deleted)
     self.seminar = seminar
     self.new = data is None
     if self.new:
         self.seminar_id = seminar_id
         self.seminar_ctr = None
         self.token = secrets.token_hex(8)
         self.by_api = False # reset by API code if needed
         self.timezone = seminar.timezone
         self.deleted = False
         self.deleted_with_seminar = False
         self.hidden = False
         for key, typ in db.talks.col_type.items():
             if key == "id" or hasattr(self, key):
                 continue
             if key in inherited_talk_columns:
                 setattr(self, key, getattr(seminar, key))
             elif typ == "text":
                 setattr(self, key, "")
             elif typ == "text[]":
                 setattr(self, key, [])
             else:
                 # don't complain about columns we know are going to be set later
                 if not key in ["edited_by", "edited_at", "start_time", "end_time"]:
                     critical("Need to update talk code to account for schema change key=%s" % key)
                 setattr(self, key, None)
     else:
         # The output from psycopg2 seems to always be given in the server's time zone
         if data.get("timezone"):
             tz = pytz.timezone(data["timezone"])
             if data.get("start_time"):
                 data["start_time"] = adapt_datetime(data["start_time"], tz)
             if data.get("end_time"):
                 data["end_time"] = adapt_datetime(data["end_time"], tz)
         self.__dict__.update(data)
         self.cleanse()
예제 #5
0
 def __init__(
     self,
     semid=None,
     semctr=None,
     data=None,
     seminar=None,
     editing=False,
     showing=False,
     saving=False,
     deleted=False,
 ):
     if data is None and not editing:
         data = talks_lookup(semid, semctr, include_deleted=deleted)
         if data is None:
             raise ValueError("Talk %s/%s does not exist" % (semid, semctr))
         data = dict(data.__dict__)
     elif data is not None:
         data = dict(data)
         # avoid Nones
         if data.get("topics") is None:
             data["topics"] = []
     if seminar is None:
         seminar = WebSeminar(semid, deleted=deleted)
     self.seminar = seminar
     self.new = data is None
     self.deleted=False
     if self.new:
         self.seminar_id = semid
         self.seminar_ctr = None
         self.token = "%016x" % random.randrange(16 ** 16)
         self.display = seminar.display
         self.online = getattr(seminar, "online", bool(seminar.live_link))
         self.timezone = seminar.timezone
         for key, typ in db.talks.col_type.items():
             if key == "id" or hasattr(self, key):
                 continue
             elif db.seminars.col_type.get(key) == typ and getattr(seminar, key, None):
                 # carry over from seminar, but not comments
                 setattr(self, key, getattr(seminar, key) if key != "comments" else "")
             elif typ == "text":
                 setattr(self, key, "")
             elif typ == "text[]":
                 setattr(self, key, [])
             else:
                 critical("Need to update talk code to account for schema change key=%s" % key)
                 setattr(self, key, None)
     else:
         # The output from psycopg2 seems to always be given in the server's time zone
         if data.get("timezone"):
             tz = pytz.timezone(data["timezone"])
             if data.get("start_time"):
                 data["start_time"] = adapt_datetime(data["start_time"], tz)
             if data.get("end_time"):
                 data["end_time"] = adapt_datetime(data["end_time"], tz)
         # transition to topics including the subject
         if data.get("topics"):
             data["topics"] = [(topic if "_" in topic else "math_" + topic) for topic in data["topics"]]
         self.__dict__.update(data)
예제 #6
0
파일: talk.py 프로젝트: tornaria/seminars
 def __init__(
     self,
     seminar_id=None,
     seminar_ctr=None,
     data=None,
     seminar=None,
     editing=False,
     showing=False,
     saving=False,
     deleted=False,
 ):
     if data is None and not editing:
         data = talks_lookup(seminar_id,
                             seminar_ctr,
                             include_deleted=deleted)
         if data is None:
             raise ValueError("Talk %s/%s does not exist" %
                              (seminar_id, seminar_ctr))
         data = dict(data.__dict__)
     elif data is not None:
         data = dict(data)
         # avoid Nones
         if data.get("topics") is None:
             data["topics"] = []
     if data and data.get("deleted"):
         deleted = True
     if seminar is None:
         seminar = WebSeminar(seminar_id, deleted=deleted)
     self.seminar = seminar
     self.new = data is None
     self.deleted = False
     if self.new:
         self.seminar_id = seminar_id
         self.seminar_ctr = None
         self.token = secrets.token_hex(8)
         self.display = seminar.display
         self.online = getattr(seminar, "online", bool(seminar.live_link))
         self.by_api = False  # reset by API code if needed
         self.timezone = seminar.timezone
         for key, typ in db.talks.col_type.items():
             if key == "id" or hasattr(self, key):
                 continue
             elif db.seminars.col_type.get(key) == typ and getattr(
                     seminar, key, None):
                 # carry over from seminar, but not comments
                 setattr(self, key,
                         getattr(seminar, key) if key != "comments" else "")
                 print("talk inherited %s = %s from seminar" %
                       (key, getattr(self, key)))
             elif typ == "text":
                 setattr(self, key, "")
             elif typ == "text[]":
                 setattr(self, key, [])
             else:
                 critical(
                     "Need to update talk code to account for schema change key=%s"
                     % key)
                 setattr(self, key, None)
     else:
         # The output from psycopg2 seems to always be given in the server's time zone
         if data.get("timezone"):
             tz = pytz.timezone(data["timezone"])
             if data.get("start_time"):
                 data["start_time"] = adapt_datetime(data["start_time"], tz)
             if data.get("end_time"):
                 data["end_time"] = adapt_datetime(data["end_time"], tz)
         self.__dict__.update(data)
     self.cleanse()
예제 #7
0
파일: app.py 프로젝트: davidfarmer/lmfdb
 def static_fn():
     fn = os.path.join(os.path.dirname(os.path.abspath(__file__)), "static", name)
     if os.path.exists(fn):
         return open(fn).read()
     critical("root_static_file: file %s not found!" % fn)
     return abort(404, 'static file %s not found.' % fn)
예제 #8
0
 def __init__(
     self,
     shortname,
     data=None,
     organizers=None,
     editing=False,
     include_deleted=False,
     include_pending=False,
     user=None,
 ):
     if user is None:
         user = current_user
     if data is None and not editing:
         data = seminars_lookup(shortname,
                                include_deleted=include_deleted,
                                include_pending=include_pending)
         if data is None:
             raise ValueError("Seminar %s does not exist" % shortname)
         data = dict(data.__dict__)
     elif data is not None:
         data = dict(data)
         if data.get("topics") is None:
             data["topics"] = []
         if data.get("institutions") is None:
             data["institutions"] = []
         if data.get("timezone") is None:
             data["timesone"] = str(user.tz)
     self.new = data is None
     self.deleted = False
     if self.new:
         self.shortname = shortname
         self.display = user.is_creator
         self.online = True  # default
         self.by_api = False  # reset by API code if needed
         self.access_control = 4  # default is instant registration
         self.edited_by = user.id
         self.visibility = 2  # public by default, once display is set to True
         self.audience = 0  # default is researchers
         self.is_conference = False  # seminar by default
         self.frequency = 7
         self.per_day = 1
         self.weekday = self.start_time = self.end_time = None
         self.timezone = str(user.tz)
         self.language = 'en'  # default is English
         for key, typ in db.seminars.col_type.items():
             if key == "id" or hasattr(self, key):
                 continue
             elif typ == "text":
                 setattr(self, key, "")
             elif typ == "text[]":
                 setattr(self, key, [])
             elif typ == "smallint[]":
                 setattr(self, key, [])
             elif typ == "timestamp with time zone":
                 setattr(self, key, None)
             elif typ == "timestamp with time zone[]":
                 setattr(self, key, [])
             elif typ == "date":
                 setattr(self, key, None)
             else:
                 from lmfdb.logger import critical
                 # don't write these to the flasklog
                 critical(
                     "Need to update seminar code to account for schema change key=%s"
                     % key)
                 setattr(self, key, None)
         if organizers is None:
             organizers = [{
                 "seminar_id": self.shortname,
                 "email": user.email,
                 "homepage": user.homepage,
                 "name": user.name,
                 "order": 0,
                 "curator": False,
                 "display": True,
             }]
     else:
         self.__dict__.update(data)
     if organizers is None:
         organizers = list(
             db.seminar_organizers.search({"seminar_id": self.shortname},
                                          sort=["order"]))
     self.organizers = organizers
     self.cleanse()
예제 #9
0
 def __init__(
     self, shortname, data=None, organizers=None, editing=False, showing=False, saving=False, deleted=False,  user=None,
 ):
     if user is None:
         user = current_user
     if data is None and not editing:
         data = seminars_lookup(shortname, include_deleted=deleted)
         if data is None:
             raise ValueError("Seminar %s does not exist" % shortname)
         data = dict(data.__dict__)
     elif data is not None:
         data = dict(data)
         if data.get("topics") is None:
             data["topics"] = []
         if data.get("institutions") is None:
             data["institutions"] = []
         if data.get("timezone") is None:
             data["timesone"] = str(user.tz)
     self.new = data is None
     self.deleted = False
     if self.new:
         self.shortname = shortname
         self.display = user.is_creator
         self.online = True  # default
         self.by_api = False # reset by API code if needed
         self.access = "open"  # default FIXME: remove once we switch to access_control
         self.access_control = 4 # default is instant registration
         self.access_time = None
         self.edited_by = user.id
         self.visibility = 2 # public by default, once display is set to True
         self.level = 0 # default is research seminar
         self.is_conference = False  # seminar by default
         self.frequency = 7
         self.per_day = 1
         self.weekday = self.start_time = self.end_time = None
         self.timezone = str(user.tz)
         for key, typ in db.seminars.col_type.items():
             if key == "id" or hasattr(self, key):
                 continue
             elif typ == "text":
                 setattr(self, key, "")
             elif typ == "text[]":
                 setattr(self, key, [])
             elif typ == "smallint[]":
                 setattr(self, key, [])
             elif typ == "timestamp with time zone":
                 setattr(self, key, None)
             elif typ == "timestamp with time zone[]":
                 setattr(self, key, [])
             elif typ == "date":
                 setattr(self, key, None)
             else:
                 critical(
                     "Need to update seminar code to account for schema change key=%s" % key
                 )
                 setattr(self, key, None)
         if organizers is None:
             organizers = [
                 {
                     "seminar_id": self.shortname,
                     "email": user.email,
                     "homepage": user.homepage,
                     "name": user.name,
                     "order": 0,
                     "curator": False,
                     "display": True,
                     "contact": True,
                 }
             ]
     else:
         # The output from psycopg2 seems to always be given in the server's time zone
         if data.get("timezone"):
             tz = pytz.timezone(data["timezone"])
             if data.get("start_time"):
                 data["start_time"] = adapt_datetime(data["start_time"], tz)
             if data.get("end_time"):
                 data["end_time"] = adapt_datetime(data["end_time"], tz)
         self.__dict__.update(data)
     if organizers is None:
         organizers = list(
             db.seminar_organizers.search({"seminar_id": self.shortname}, sort=["order"])
         )
     self.organizers = organizers
     self.cleanse()
예제 #10
0
 def __init__(self,
              shortname,
              data=None,
              organizer_data=None,
              editing=False,
              showing=False,
              saving=False,
              deleted=False):
     if data is None and not editing:
         data = seminars_lookup(shortname, include_deleted=deleted)
         if data is None:
             raise ValueError("Seminar %s does not exist" % shortname)
         data = dict(data.__dict__)
     elif data is not None:
         data = dict(data)
         if data.get("topics") is None:
             data["topics"] = []
         if data.get("institutions") is None:
             data["institutions"] = []
         if data.get("timezone") is None:
             data["timesone"] = str(current_user.tz)
     self.new = data is None
     self.deleted = False
     if self.new:
         self.shortname = shortname
         self.display = current_user.is_creator
         self.online = True  # default
         self.access = "open"  # default
         self.visibility = 2  # public by default, once display is set to True
         self.is_conference = False  # seminar by default
         self.frequency = 7
         self.per_day = 1
         self.weekday = self.start_time = self.end_time = None
         self.timezone = str(current_user.tz)
         for key, typ in db.seminars.col_type.items():
             if key == "id" or hasattr(self, key):
                 continue
             elif typ == "text":
                 setattr(self, key, "")
             elif typ == "text[]":
                 setattr(self, key, [])
             elif typ == "smallint[]":
                 setattr(self, key, [])
             elif typ == "timestamp with time zone":
                 setattr(self, key, None)
             elif typ == "timestamp with time zone[]":
                 setattr(self, key, [])
             elif typ == "date":
                 setattr(self, key, None)
             elif typ == "bigint":
                 setattr(self, key, None)
             else:
                 critical(
                     "Need to update seminar code to account for schema change key=%s"
                     % key)
                 setattr(self, key, None)
         if organizer_data is None:
             organizer_data = [{
                 "seminar_id": self.shortname,
                 "email": current_user.email,
                 "homepage": current_user.homepage,
                 "full_name": current_user.name,
                 "order": 0,
                 "curator": False,
                 "display": True,
                 "contact": True,
             }]
     else:
         # The output from psycopg2 seems to always be given in the server's time zone
         if data.get("timezone"):
             tz = pytz.timezone(data["timezone"])
             if data.get("start_time"):
                 data["start_time"] = adapt_datetime(data["start_time"], tz)
             if data.get("end_time"):
                 data["end_time"] = adapt_datetime(data["end_time"], tz)
         # transition to topics including the subject
         if data.get("topics"):
             data["topics"] = [(topic if "_" in topic else "math_" + topic)
                               for topic in data["topics"]]
         self.__dict__.update(data)
     if organizer_data is None:
         organizer_data = list(
             db.seminar_organizers.search({"seminar_id": self.shortname},
                                          sort=["order"]))
     self.organizer_data = organizer_data
     self.convert_time_to_times()