opsv2/model/news.py
2020-12-01 16:31:04 +08:00

191 lines
5.8 KiB
Python

#!/usr/bin/env python
#-*- coding:utf-8 -*-
from datetime import datetime
from libs import Base, db_session
from utils import obj2dict
from sqlalchemy import Column, Integer, String, DateTime, Text, ForeignKey
from sqlalchemy.orm import relationship, backref
from model.admin import Admin
class News(Base):
__tablename__ = 'wmh_news'
news_id = Column(Integer, primary_key=True)
title = Column(String(50))
content = Column(Text)
create_time = Column(DateTime)
update_time = Column(DateTime)
status = Column(Integer)
create_uid = Column(Integer, ForeignKey('wmh_admin.user_id'))
category_id = Column(Integer, ForeignKey('wmh_news_category.category_id'))
#category = relationship('NewsCategory', backref='News')
def __init__(self, news_id, category_id, title, content, create_uid=0, status=0, create_time='', update_time=''):
self.news_id = news_id
self.category_id = category_id
self.title = title
self.content = content
if create_time:
self.create_time = create_time
if update_time:
self.update_time = update_time
if create_uid:
self.create_uid = create_uid
self.status = status
def __repr__(self):
return "<News('%s')>" % self.title
@classmethod
def initialize(cls, item):
if not item:
return None
news_id = item.news_id
category_id = item.category_id
title = item.title
content = item.content
create_time = item.create_time
update_time = item.update_time
create_uid = item.create_uid
status = item.status
if not news_id:
return None
return cls(news_id, category_id, title, content, create_uid, status, create_time, update_time)
@classmethod
def new(cls, category_id, title, content, create_uid, status):
"""
add new news
"""
news = News(None, category_id, title, content, create_uid, status)
#TODO optimize
news.update_time = '0000-00-00 00:00:00'
db_session.add(news)
try:
db_session.commit()
except:
db_session.rollback()
if news.news_id:
return cls.get(news.news_id)
return None
@classmethod
def update(cls, news_id, category_id, title, content, create_uid, status):
update = {}
if category_id:
update['category_id'] = category_id
if title:
update['title'] = title
if content:
update['content'] = content
if create_uid:
update['create_uid'] = create_uid
if status:
update['status'] = status
current_time = datetime.now()
update_time = current_time.strftime('%Y-%m-%d %H:%M:%S')
update['update_time'] = update_time
try:
db_session.query(News).filter(News.news_id == news_id).update(update)
db_session.commit()
return True
except:
db_session.rollback()
raise
@classmethod
def get(cls, news_id):
item = db_session.query(News.news_id, News.category_id, News.title, News.content, News.create_uid, News.status,
News.create_time, News.update_time).filter(News.news_id == news_id).first()
return item and cls.initialize(item)
@classmethod
def gets(cls, offset=0, limit=20, title='', begin=0, end=0):
end = end if end else '2039-12-12'
rs = db_session.query(News.news_id, News.news_id.label('operate_id'), News.category_id, News.title,
News.create_time, News.create_uid, News.update_time, News.status,
NewsCategory.category_name, Admin.username).\
join(NewsCategory, Admin).\
filter(News.category_id == NewsCategory.category_id, News.create_uid == Admin.user_id).\
filter(News.title.like('%'+title+'%')).\
filter(News.create_time >= begin, News.create_time <= end).\
offset(offset).limit(limit)
return rs.all()
@classmethod
def get_count(cls):
return db_session.query(News).count()
class NewsCategory(Base):
__tablename__ = 'wmh_news_category'
category_id = Column(Integer, primary_key=True)
category_name = Column(String(50))
def __init__(self, category_id, category_name):
self.category_id = category_id
self.category_name = category_name
def __repr__(self):
return "<NewsCategory('%s')>" % self.category_name
@classmethod
def new(cls, category_name):
"""
add new news
"""
newsCategory = NewsCategory(None, category_name)
db_session.add(newsCategory)
try:
db_session.commit()
except:
db_session.rollback()
if newsCategory.category_id:
return cls.get(newsCategory.category_id)
return None
@classmethod
def update(cls, category_id, category_name):
update = {}
if category_name:
update['category_name'] = category_name
try:
db_session.query(NewsCategory).filter(NewsCategory.category_id == category_id).update(update)
db_session.commit()
return True
except:
db_session.rollback()
raise
@classmethod
def get(cls, category_id):
item = db_session.query(NewsCategory.category_id, NewsCategory.category_name)\
.filter(NewsCategory.category_id == category_id).first()
return item
@classmethod
def gets(cls, start=0, limit=20):
rs = db_session.query(NewsCategory.category_id, NewsCategory.category_name).offset(start).limit(limit)
return rs.all()
@classmethod
def get_count(cls):
return db_session.query(NewsCategory).count()