diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/php/application.xml | 39 | ||||
-rw-r--r-- | app/php/pages/Home.page | 8 | ||||
l--------- | app/php/runtime | 1 | ||||
-rw-r--r-- | app/python/.gitignore | 1 | ||||
-rw-r--r-- | app/python/rcal/__init__.py | 0 | ||||
-rw-r--r-- | app/python/rcal/db.py | 34 | ||||
-rw-r--r-- | app/python/rcal/model.py | 122 |
7 files changed, 205 insertions, 0 deletions
diff --git a/app/php/application.xml b/app/php/application.xml new file mode 100644 index 0000000..98f3af5 --- /dev/null +++ b/app/php/application.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8"?> + +<application id="http" mode="Debug"> + <!-- alias definitions and namespace usings + <paths> + <alias id="myalias" path="./lib" /> + <using namespace="Application.common.*" /> + </paths> + --> + + <!-- configurations for modules --> + <modules> + <!-- Remove this comment mark to enable caching + <module id="cache" class="System.Caching.TDbCache" /> + --> + + <!-- Remove this comment mark to enable PATH url format + <module id="request" class="THttpRequest" UrlFormat="Path" /> + --> + + <!-- Remove this comment mark to enable logging + <module id="log" class="System.Util.TLogRouter"> + <route class="TBrowserLogRoute" Categories="System" /> + </module> + --> + </modules> + + <!-- configuration for available services --> + <services> + <service id="page" class="TPageService" DefaultPage="Home" /> + </services> + + <!-- application parameters + <parameters> + <parameter id="param1" value="value1" /> + <parameter id="param2" value="value2" /> + </parameters> + --> +</application> diff --git a/app/php/pages/Home.page b/app/php/pages/Home.page new file mode 100644 index 0000000..368b3e7 --- /dev/null +++ b/app/php/pages/Home.page @@ -0,0 +1,8 @@ +<html> +<head> + <title>Welcome to PRADO</title> +</head> +<body> +<h1>Welcome to PRADO!</h1> +</body> +</html>
\ No newline at end of file diff --git a/app/php/runtime b/app/php/runtime new file mode 120000 index 0000000..2cee2e0 --- /dev/null +++ b/app/php/runtime @@ -0,0 +1 @@ +../../cache/prado
\ No newline at end of file diff --git a/app/python/.gitignore b/app/python/.gitignore new file mode 100644 index 0000000..df04015 --- /dev/null +++ b/app/python/.gitignore @@ -0,0 +1 @@ +rcal/*.pyc diff --git a/app/python/rcal/__init__.py b/app/python/rcal/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/app/python/rcal/__init__.py diff --git a/app/python/rcal/db.py b/app/python/rcal/db.py new file mode 100644 index 0000000..68d5b0d --- /dev/null +++ b/app/python/rcal/db.py @@ -0,0 +1,34 @@ +import json +from os import path + +import sqlalchemy.engine.url as url +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + + +class Session(object): + + engine = None + + def __init__(self): + config = json.load( + open(path.join(path.dirname( + path.realpath(__file__)), '../../..', 'conf', 'db.json'))) + db_str = url.URL( + drivername=config['type'], + host=config['host'], + username=config['user'], + password=config['pass'], + database=config['name'], + query={'charset': config['cset']} + ) + self.engine = create_engine(db_str, encoding=config['cset']) + + def get_maker(self): + return sessionmaker(bind=self.engine) + + @staticmethod + def create(): + session = Session() + maker = session.get_maker() + return maker() diff --git a/app/python/rcal/model.py b/app/python/rcal/model.py new file mode 100644 index 0000000..faed188 --- /dev/null +++ b/app/python/rcal/model.py @@ -0,0 +1,122 @@ +# pylint: disable=too-few-public-methods, invalid-name +from sqlalchemy import Column, ForeignKey +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import relationship +from sqlalchemy.types import (TIMESTAMP, Boolean, DateTime, Integer, String, + TypeDecorator) + +from dateutil.tz import tzutc + + +class UTCDateTime(TypeDecorator): + impl = DateTime + + def process_bind_param(self, value, engine): + if value is not None: + return value.astimezone(tzutc()) + + def process_result_value(self, value, engine): + if value is not None: + return value.replace(tzinfo=tzutc()) + + +BASE = declarative_base() + + +class Calendar(BASE): + __tablename__ = 'calendars' + + uid = Column(String(255), primary_key=True) + url = Column(String(255)) + name = Column(String(255), index=True) + website = Column(String(255)) + visible = Column(Boolean, index=True) + last_updated = Column(TIMESTAMP) + + _category = Column( + Integer, + ForeignKey( + 'categories.id', + onupdate='CASCADE', + ondelete='SET NULL')) + category = relationship( + 'Category', + back_populates='calendars', + order_by='Calendar.name') + + entries = relationship( + 'Entry', + back_populates='calendar', + cascade="all", + passive_deletes=True, + order_by='Entry.begin_date') + + @staticmethod + def fetch(uid, session, name=None, url=None): + calendar = session.query(Calendar).filter(Calendar.uid == uid).first() + if not calendar: + calendar = Calendar() + calendar.uid = uid + session.add(calendar) + if name: + calendar.name = name + if url: + calendar.url = url + return calendar + + +class Entry(BASE): + __tablename__ = 'entries' + + id = Column(Integer, primary_key=True) + uid = Column(String(255), index=True, unique=True) + begin_date = Column(UTCDateTime, index=True) + end_date = Column(UTCDateTime) + all_day = Column(Boolean) + name = Column(String(255)) + location = Column(String(255)) + + _calendar = Column( + String(255), + ForeignKey( + 'calendars.uid', + onupdate='CASCADE', + ondelete='CASCADE')) + calendar = relationship( + 'Calendar', + back_populates='entries', + order_by='Entry.begin_date') + + @staticmethod + def fetch(uid, session): + entry = session.query(Entry).filter(Entry.uid == uid).first() + if not entry: + entry = Entry() + session.add(entry) + return entry + + +class Category(BASE): + __tablename__ = 'categories' + + id = Column(Integer, primary_key=True) + name = Column(String(255), index=True) + + calendars = relationship( + 'Calendar', + back_populates='category', + cascade="all", + passive_deletes=True, + order_by='Calendar.name') + + @staticmethod + def fetch(name, session): + category = session.query(Category).filter( + Category.name == name).first() + if not category: + category = Category() + category.name = name + session.add(category) + return category + +__all__ = ('Calendar', 'Entry', 'Category') |