diff --git a/cao_sunyata/__init__.py b/cao_sunyata/__init__.py index e5f3bac..5462c6d 100644 --- a/cao_sunyata/__init__.py +++ b/cao_sunyata/__init__.py @@ -4,7 +4,7 @@ from pyramid.authorization import ACLAuthorizationPolicy from pyramid.session import SignedCookieSessionFactory from pyramid_mailer import mailer_factory_from_settings -from .services.user import groupfinder +from .models.users import groupfinder def main(global_config, **settings): diff --git a/cao_sunyata/models/__init__.py b/cao_sunyata/models/__init__.py index b8b767e..24773c2 100644 --- a/cao_sunyata/models/__init__.py +++ b/cao_sunyata/models/__init__.py @@ -3,11 +3,6 @@ from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import configure_mappers import zope.sqlalchemy -# import or define all models here to ensure they are attached to the -# Base.metadata prior to any initialization routines -from .user import User -from .blog_record import BlogRecord - # run configure_mappers after defining all of the models to ensure # all relationships can be setup configure_mappers() diff --git a/cao_sunyata/models/blog_record.py b/cao_sunyata/models/blog_record.py deleted file mode 100644 index c768a79..0000000 --- a/cao_sunyata/models/blog_record.py +++ /dev/null @@ -1,56 +0,0 @@ -import datetime #<- will be used to set default dates on models -from cao_sunyata.models.meta import Base #<- we need to import our sqlalchemy metadata from which model classes will inherit -from sqlalchemy import ( - Column, - Integer, - Unicode, #<- will provide Unicode field - UnicodeText, #<- will provide Unicode text field - DateTime, #<- time abstraction field - Index, - ForeignKey, -) -from sqlalchemy.orm import relationship - -from webhelpers2.text import urlify #<- will generate slugs -from webhelpers2.date import distance_of_time_in_words #<- human friendly dates -import unidecode - -class BlogRecord(Base): - __tablename__ = 'entries' - id = Column(Integer, primary_key=True) - title = Column(Unicode(255), unique=True, nullable=False) - body = Column(UnicodeText, default='') - created = Column(DateTime, default=datetime.datetime.now) - creator = Column(Unicode(50), default='') - edited = Column(DateTime, default=datetime.datetime.now) - editor = Column(Unicode(50), default='') - topic_id = Column(ForeignKey('topics.topic'), nullable=False) - topic = relationship('Topics', backref='topic_pages') - tag = Column(Unicode(25)) - author = Column(Unicode(50), default='') - status = Column(Unicode(50), default='brouillon') - - @property - def slug(self): - # remove ascents - title = unidecode.unidecode(self.title) - return urlify(title) - - @property - def created_in_words(self): - return distance_of_time_in_words(self.created, datetime.datetime.now()) - - -class Topics(Base): - __tablename__ = 'topics' - topic = Column(Unicode(25), primary_key=True) - topic_name = Column(Unicode(25), nullable=False) - topic_quote = Column(Unicode(255), default='') - -class Tags(Base): - __tablename__ = 'tags' - id = Column(Integer, primary_key=True) - topic = Column(Unicode(25)) - tag = Column(Unicode(25)) - tag_name = Column(Unicode(25), nullable=False) - __table_args__ = (Index('topic_index', "topic", "tag"), ) diff --git a/cao_sunyata/models/default.py b/cao_sunyata/models/default.py new file mode 100644 index 0000000..1c10b4b --- /dev/null +++ b/cao_sunyata/models/default.py @@ -0,0 +1,10 @@ +# -*- coding: utf8 -*- +from zope.sqlalchemy import mark_changed +import transaction + +def execute_query(request, query, params): + """Execute query and mark session as changed""" + request.dbsession.execute(query, params) + mark_changed(request.dbsession) + transaction.commit() + diff --git a/cao_sunyata/models/entries.py b/cao_sunyata/models/entries.py new file mode 100644 index 0000000..31139b4 --- /dev/null +++ b/cao_sunyata/models/entries.py @@ -0,0 +1,103 @@ +# -*- coding: utf8 -*- +from .default import ( + execute_query, +) + +def get_entries_by_topic(request, topic, tag): + query = f"SELECT * FROM entries WHERE topic_id = {topic}" + if request.authenticated_userid == None: + # if user is anonym, display only published posts + query = query + " AND status='publié'" + else: + if request.authenticated_userid != 'admin': + # if user is not 'admin', hide admin posts + query = query + " AND tag =! '_admin'" + if tag != '': + query = query + " AND tag = {tag}" + + query = query + " ORDER BY tag, title;" + results = request.dbsession.execute(query).fetchall() + return results + +def get_entries_by_criteria(request, criteria): + search = "%{}%".format(criteria) + query = f"SELECT * FROM entries WHERE title = {search} or body = {search}" + if request.authenticated_userid == None: + # if user is anonym, display only published posts + query = query + " AND status='publié'" + else: + if request.authenticated_userid != 'admin': + # if user is not 'admin', hide admin posts + query = query + " AND tag =! '_admin'" + query = query + " ORDER BY title;" + results = request.dbsession.execute(query).fetchall() + return results + +def get_entries_by_id(request, _id): + query = "SELECT * FROM entries WHERE id=:id;" + results = request.dbsession.execute(query, {'id':_id}).first() + return results + +def get_last_created(request): + # gest the 10 last created posts + query = "SELECT strftime('%d/%m/%Y', created) AS create_date, title, author, status FROM entries WHERE topic_id <> '_admin'" + if request.authenticated_userid == None: + # if user is anonym, display only published posts + query = query + " AND status='publié'" + + query = query + " ORDER BY created DESC LIMIT 10;" + results = request.dbsession.execute(query).fetchall() + return results + +def get_last_edited(request): + # gest the last edited posts + query = "SELECT strftime('%d/%m/%Y', edited) AS edit_date, title, author, status FROM entries WHERE topic_id <> '_admin'" + if request.authenticated_userid == None: + # if user is anonym, display only published posts + query = query + " AND status='publié'" + + query = query + " ORDER BY edited LIMIT 10;" + results = request.dbsession.execute(query).fetchall() + return results + +def get_activities(request): + # gest the Activities section + query = "SELECT * FROM entries WHERE topic_id = '_admin' AND tag = 'activities' AND status = 'publié' ORDER BY created;" + results = request.dbsession.execute(query,).first() + return results + +def get_tags_byTopic(request, topic): + # get tags + query = "SELECT * FROM tags WHERE topic=:topic ORDER BY tag_name;" + results = request.dbsession.execute(query, {'topic':topic}).all() + return results + +def get_tags_byId(request, id): + query = "SELECT * FROM tags WHERE id=:id;" + results = request.dbsession.execute(query, {'topic':id}).first() + return results + +def get_topic_byTopic(request, id): + # get the name of a given topic + query = "SELECT * FROM topics WHERE topic=:topic;" + results = request.dbsession.execute(query, {'topic':id}).first() + return results + +def get_topics(request): + # get all topics + query = "SELECT * FROM topics ORDER BY topic_name;" + results = request.dbsession.execute(query, {'topic':id}).all() + return results + +def entries_delete(request, id): + query = "DELETE FROM entries WHERE id = :id ;" + execute_query(request, query, {'id': id}) + +def tags_delete(request, id): + query = "DELETE FROM tags WHERE id = :id ;" + execute_query(request, query, {'id': id}) + +def topics_delete(request, id): + query = "DELETE FROM topics WHERE topic = :id ;" + execute_query(request, query, {'id': id}) + diff --git a/cao_sunyata/models/meta.py b/cao_sunyata/models/meta.py deleted file mode 100644 index 02285b3..0000000 --- a/cao_sunyata/models/meta.py +++ /dev/null @@ -1,16 +0,0 @@ -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.schema import MetaData - -# Recommended naming convention used by Alembic, as various different database -# providers will autogenerate vastly different names making migrations more -# difficult. See: http://alembic.zzzcomputing.com/en/latest/naming.html -NAMING_CONVENTION = { - "ix": "ix_%(column_0_label)s", - "uq": "uq_%(table_name)s_%(column_0_name)s", - "ck": "ck_%(table_name)s_%(constraint_name)s", - "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", - "pk": "pk_%(table_name)s" -} - -metadata = MetaData(naming_convention=NAMING_CONVENTION) -Base = declarative_base(metadata=metadata) diff --git a/cao_sunyata/models/user.py b/cao_sunyata/models/user.py deleted file mode 100644 index 9041b7f..0000000 --- a/cao_sunyata/models/user.py +++ /dev/null @@ -1,34 +0,0 @@ -import datetime #<- will be used to set default dates on models -from cao_sunyata.models.meta import Base #<- we need to import our sqlalchemy metadata from which model classes will inherit -from sqlalchemy import ( - Column, - Integer, - Unicode, #<- will provide Unicode field - UnicodeText, #<- will provide Unicode text field - DateTime, #<- time abstraction field -) - -from passlib.apps import custom_app_context as blogger_pwd_context - - -class User(Base): - __tablename__ = 'users' - id = Column(Integer, primary_key=True) - name = Column(Unicode(255), unique=True, nullable=False) - password = Column(Unicode(255), nullable=False) - last_logged = Column(DateTime, default=datetime.datetime.utcnow) - - def verify_password(self, password): - # is it cleartext? - if password == self.password: - self.set_password(password) - # verify password - result = blogger_pwd_context.verify(password, self.password) - if result: - # pwd OK, set last login date - self.last_logged = datetime.datetime.now() - return result - - def set_password(self, password): - password_hash = blogger_pwd_context.encrypt(password) - self.password = password_hash diff --git a/cao_sunyata/models/users.py b/cao_sunyata/models/users.py new file mode 100644 index 0000000..17208a2 --- /dev/null +++ b/cao_sunyata/models/users.py @@ -0,0 +1,57 @@ +# -*- coding: utf8 -*- +from .default import ( + execute_query, +) +import datetime #<- will be used to set default dates on models + +def get_users_all(request): + query = "SELECT id, name, strftime('%d/%m/%Y %H:%M:%S', last_logged) as last_login FROM users ORDER BY name;" + results = results = request.dbsession.execute(query).fetchall() + return results + + +def get_users_by_name(request, name ): + query = "SELECT * FROM users WHERE name=:name;" + results = request.dbsession.execute(query, {'name': name}).first() + return results + + +def delete_user(request, id): + query = "DELETE FROM users WHERE id = :id ;" + execute_query(request, query, {'id': id}) + return + +def groupfinder(userid, request): + + if userid: + # user name is 'admin' ? + if userid == 'admin': + return ['group:administrators'] + else: + return [] # it means that userid is logged in + else: + # it returns None if userid isn't logged in + return None + +def update_user(request, name, new_values): + # formater les champs + s = '' + for param in new_values.keys(): + if s: + s += ",%s=:%s" % (param, param) + else: + s = "%s=:%s" % (param, param) + + import pdb;pdb.set_trace() + if name == '0': + query = "INSERT INTO users (name, password) VALUES ('{0}', '{1}')".format(new_values['name'], new_values['password']) + else: + new_values['name'] = name + query = "UPDATE users SET %s WHERE name = :name;" % s + execute_query(request, query, new_values) + +def update_last_connection(request, id): + """Update last connection for login """ + last_logged = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + query = "UPDATE users SET last_logged = '" + last_logged + "' WHERE id=:id;" + execute_query(request, query, {'id': id}) diff --git a/cao_sunyata/services/__init__.py b/cao_sunyata/services/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/cao_sunyata/services/blog_record.py b/cao_sunyata/services/blog_record.py deleted file mode 100644 index 90d272d..0000000 --- a/cao_sunyata/services/blog_record.py +++ /dev/null @@ -1,110 +0,0 @@ -import sqlalchemy as sa -import datetime #<- will be used to set default dates on models - -from sqlalchemy import or_, and_ -from ..models.blog_record import BlogRecord, Topics, Tags - - -class BlogRecordService(object): - - @classmethod - def by_topic(cls, request, topic, tag): - # get posts by topic - query = request.dbsession.query(BlogRecord).filter(BlogRecord.topic_id == topic) - if request.authenticated_userid == None: - # if user is anonym, display only published posts - query = query.filter(BlogRecord.status == 'publié') - if request.authenticated_userid != 'admin': - # if user is not 'admin', hide admin posts - query = query.filter(BlogRecord.tag != 'admin') - if tag != '': - query = query.filter(BlogRecord.tag == tag) - return query.order_by(BlogRecord.tag, BlogRecord.title).all() - - @classmethod - def by_criteria(cls, request, criteria): - search = "%{}%".format(criteria) - query = request.dbsession.query(BlogRecord).filter(or_(BlogRecord.title.like(search), - BlogRecord.body.like(search))) - # import pdb;pdb.set_trace() - if request.authenticated_userid == None: - # if user is anonym, display only published posts - query = query.filter(BlogRecord.status == 'publié') - if request.authenticated_userid != 'admin': - # if user is not 'admin', hide admin posts - query = query.filter(BlogRecord.topic_id != '_admin') - return query.order_by(BlogRecord.title).all() - - @classmethod - def by_id(cls, request, _id): - query = request.dbsession.query(BlogRecord).filter(BlogRecord.id == _id).first() - return query - - @classmethod - def get_last_created(cls, request): - # gest the 10 last created posts - query = request.dbsession.query(BlogRecord).filter(BlogRecord.topic_id != '_admin') - if request.authenticated_userid == None: - # if user is anonym, display only published posts - query = query.filter(BlogRecord.status == 'publié') - query = query.order_by(sa.desc(BlogRecord.created)).limit(10).all() - return query - - @classmethod - def get_last_edited(cls, request): - # gest the last edited posts - query = request.dbsession.query(BlogRecord).filter(BlogRecord.topic_id != '_admin') - if request.authenticated_userid == None: - # if user is anonym, display only published posts - query = query.filter(BlogRecord.status == 'publié') - query = query.order_by(sa.desc(BlogRecord.edited)).limit(10).all() - return query - - @classmethod - def get_activities(cls, request): - # gest the Activities section - query = request.dbsession.query(BlogRecord).filter(and_(BlogRecord.topic_id == '_admin', - BlogRecord.tag == 'activities', - BlogRecord.status == 'publié')) - query = query.order_by(sa.desc(BlogRecord.created)).first() - return query - - @classmethod - def get_tags_byTopic(cls, request, topic): - # gest the last 5 items modified - query = request.dbsession.query(Tags).filter(Tags.topic == topic) - query = query.order_by(Tags.tag_name).all() - return query - - @classmethod - def get_tags_byId(cls, request, id): - # gest the last 5 items modified - query = request.dbsession.query(Tags).filter(Tags.id == id).first() - return query - - @classmethod - def get_topic_byTopic(cls, request, id): - # get the name of a given topic - query = request.dbsession.query(Topics).filter(Topics.topic == id).first() - return query - - @classmethod - def get_topics(cls, request): - # get all topics - query = request.dbsession.query(Topics).order_by(Topics.topic_name).all() - return query - - @classmethod - def delete(cls, request, id): - request.dbsession.query(BlogRecord).filter(BlogRecord.id == id).delete(synchronize_session=False) - return - - @classmethod - def tag_delete(cls, request, id): - request.dbsession.query(Tags).filter(Tags.id == id).delete(synchronize_session=False) - return - - @classmethod - def topic_delete(cls, request, id): - request.dbsession.query(Topics).filter(Topics.topic == id).delete(synchronize_session=False) - return diff --git a/cao_sunyata/services/user.py b/cao_sunyata/services/user.py deleted file mode 100644 index 2d771f1..0000000 --- a/cao_sunyata/services/user.py +++ /dev/null @@ -1,32 +0,0 @@ -import sqlalchemy as sa -from ..models.user import User - - -class UserService(object): - - @classmethod - def all(cls, request): - items = request.dbsession.query(User).order_by(sa.asc(User.name)).all() - return items - - @classmethod - def by_name(cls, request, name ): - item = request.dbsession.query(User).filter(User.name == name).first() - return item - - @classmethod - def delete(cls, request, id): - request.dbsession.query(User).filter(User.id == id).delete(synchronize_session=False) - return - -def groupfinder(userid, request): - - if userid: - # user name is 'admin' ? - if userid == 'admin': - return ['group:administrators'] - else: - return [] # it means that userid is logged in - else: - # it returns None if userid isn't logged in - return None diff --git a/cao_sunyata/templates/home.jinja2 b/cao_sunyata/templates/home.jinja2 index 4f881c0..cca4c88 100644 --- a/cao_sunyata/templates/home.jinja2 +++ b/cao_sunyata/templates/home.jinja2 @@ -76,7 +76,7 @@ {% for entry in last_ten %} - + diff --git a/cao_sunyata/templates/settings.jinja2 b/cao_sunyata/templates/settings.jinja2 index f37a171..9ee7879 100644 --- a/cao_sunyata/templates/settings.jinja2 +++ b/cao_sunyata/templates/settings.jinja2 @@ -40,7 +40,7 @@
{{ entry.created.strftime("%d.%m.%Y") }}{{ entry.create_date }} {{ entry.title }}
{% for entry in items %} - + - + {% endfor %}
{{ entry.edited.strftime("%d-%m-%Y") }}{{ entry.edit_date }} {{ entry.editor }} {{ entry.title }} diff --git a/cao_sunyata/templates/user_edit.jinja2 b/cao_sunyata/templates/user_edit.jinja2 index 929cc95..1a5b949 100644 --- a/cao_sunyata/templates/user_edit.jinja2 +++ b/cao_sunyata/templates/user_edit.jinja2 @@ -8,33 +8,19 @@ {% endif %} -
- - {% for error in form.name.errors %} -
{{ error }}
- {% endfor %} +
- - {% if form.id.data %} - + + {% if name != '0' %} + {% else %} - {{form.name(class_='form-control')}} + {% endif %}
-
- - {{form.password(class_='form-control')}} -
- - {% for error in form.confirm.errors %} -
{{error}}
- {% endfor %} - -
- - {{form.confirm(class_='form-control')}} + +

@@ -42,7 +28,7 @@ Retour - {% if form.id.data and request.authenticated_userid == 'admin' %} + {% if request.authenticated_userid == 'admin' %} {% endif %} diff --git a/cao_sunyata/templates/users.jinja2 b/cao_sunyata/templates/users.jinja2 index f58d977..32db14f 100644 --- a/cao_sunyata/templates/users.jinja2 +++ b/cao_sunyata/templates/users.jinja2 @@ -24,7 +24,7 @@ {{ entry.name }}
{{ entry.last_logged.strftime("%d-%m-%Y - %H:%M") }}{{ entry.last_login }}
diff --git a/cao_sunyata/views/blog.py b/cao_sunyata/views/blog.py index da7a3c3..1e83a02 100644 --- a/cao_sunyata/views/blog.py +++ b/cao_sunyata/views/blog.py @@ -3,8 +3,7 @@ from pyramid.httpexceptions import HTTPNotFound, HTTPFound import markdown import datetime #<- will be used to set default dates on models -from ..models.blog_record import BlogRecord -from ..services.blog_record import BlogRecordService +from ..models.entries import * from ..forms import BlogCreateForm, BlogUpdateForm, BlogSearchForm @@ -12,7 +11,7 @@ from ..forms import BlogCreateForm, BlogUpdateForm, BlogSearchForm def blog(request): # get post id from request blog_id = request.matchdict['id'] - entry = BlogRecordService.by_id(request, blog_id) + entry = get_entries_by_id(request, blog_id) if not entry: request.session.flash(u"Page non trouvée : %s" % blog_id, 'warning') return HTTPFound(location=request.route_url('home')) @@ -36,7 +35,7 @@ def blog_copy(request): blog_id = request.matchdict['id'] # get the post - entry = BlogRecordService.by_id(request, blog_id) + entry = get_entries_by_id(request, blog_id) if not entry: request.session.flash("Page non trouvée : %s" % blog_id, 'warning') return HTTPFound(location=request.route_url('topic', topic=topic)) @@ -65,7 +64,7 @@ def blog_edit(request): url = request.route_url('blog_edit',topic=topic, id=blog_id) # get the list of tags of this topic - tags = BlogRecordService.get_tags_byTopic(request, topic) + tags = get_tags_byTopic(request, topic) if blog_id == '0': # create a new post @@ -78,7 +77,7 @@ def blog_edit(request): else: # modify post - entry = BlogRecordService.by_id(request, blog_id) + entry = get_entries_by_id(request, blog_id) if not entry: request.session.flash("Page non trouvée : %s" % blog_id, 'warning') return HTTPFound(location=request.route_url('topic', topic=topic)) @@ -139,7 +138,7 @@ def blog_search(request): if tags: liste += '' @@ -149,7 +148,7 @@ def blog_search(request): if 'form.submitted' in request.params and form.validate(): criteria = request.params['criteria'] # si afficher tous les fiches ? - items = BlogRecordService.by_criteria(request, criteria) + items = get_entries_by_criteria(request, criteria) return { 'page_title': "Rechercher", @@ -179,7 +178,7 @@ def topic(request): for tag in tags: liste += '

' + tag.tag_name + '

' # lire toutes les docs du topic - items = BlogRecordService.by_topic(request, topic, tag.tag) + items = get_entries_by_topic(request, topic, tag.tag) if items: liste += '