import os from datetime import datetime from flask import Flask, redirect, render_template, request, url_for # from sqlalchemy import Column, Integer, String # from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship from flask_paginate import Pagination from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] = os.getenv( "DB_URI", "sqlite:///news.db" ) db = SQLAlchemy(app) class News(db.Model): __tablename__ = "news" nid = db.Column(db.String, primary_key=True) author = db.Column(db.Unicode) title = db.Column(db.Unicode) body = db.Column(db.Unicode) published = db.Column(db.String) last_modified = db.Column(db.String) display = db.Column(db.Unicode) comments = relationship("Comments") __mapper_args__ = {"order_by": nid} @property def canonical_url(self): return url_for( "news", year=self.published_datetime.year, month=self.published_datetime.month, nid=self.nid, ) @property def published_datetime(self): return datetime.fromtimestamp(self.published) @property def published_str(self): return str(self.published_datetime) def __repr__(self): return "" % (self.nid) class Comments(db.Model): __tablename__ = "comments" nid = db.Column(db.ForeignKey("news.nid")) num = db.Column(db.Integer) author = db.Column(db.Unicode) title = db.Column(db.Unicode) body = db.Column(db.Unicode) published = db.Column(db.String) # display = db.Column(db.Unicode) __table_args__ = (db.PrimaryKeyConstraint("nid", "num"),) __mapper_args__ = {"order_by": num} @property def canonical_url(self): return url_for( "news", year=self.published_datetime.year, month=self.published_datetime.month, nid=self.nid, ) @property def published_datetime(self): return datetime.fromtimestamp(self.published) @property def published_str(self): return str(self.published_datetime) def __repr__(self): return "" % (self.nid, self.num) @app.route("/") def home(): return """ homepage: puoi fare * /search/ * /search/by-month/YYYY/M * /news/ID * /news/YYYY/MM/ID.php """ @app.route("/search/") def search_home(): return "cerca cerca" @app.route("/search/by-month//") def search_by_month(year, month): # TODO: proper pagination page = int(request.args.get("page", "1")) - 1 first = page * 50 last = first + 50 d = datetime(year=year, month=month, day=1) ts_from = int(d.timestamp()) if month < 12: d = datetime(year=year, month=month + 1, day=1) else: d = datetime(year=year + 1, month=1, day=1) ts_to = int(d.timestamp()) news = News.query.filter( News.published >= ts_from, News.published < ts_to ).order_by("published") pagination = Pagination(page=page, total=news.count(), per_page=50) news = news[first:last] return render_template( "search_results.html", results=news, pagination=pagination ) @app.route("/news/") def news_by_nid(nid): n = News.query.get(str(nid)) return redirect(n.canonical_url) @app.route("/news///.php") def news(year, month, nid): n = News.query.get(str(nid)) return render_template("news.html", n=n, comments=n.comments)