# -*- coding: utf-8 -*- # all the imports from __future__ import with_statement from contextlib import closing import sqlite3 from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash, jsonify import requests from bs4 import BeautifulSoup import re from email.mime.text import MIMEText from subprocess import Popen, PIPE import smtplib from note import Note, Page, convert_datestring_to_date # configuration DATABASE = 'notes.db' DEBUG = True SECRET_KEY = 'development key' USERNAME = 'admin' PASSWORD = 'dupa.8' app = Flask(__name__) app.config.from_object(__name__) class Thumb: def __init__(self, source, href, tags): self.src = source self.href = href self.tags = tags #DB functions def connect_db(): return sqlite3.connect(app.config['DATABASE']) def init_db(): with closing(connect_db()) as db: with app.open_resource('schema.sql') as f: db.cursor().executescript(f.read()) db.commit() def query_db(query, args=(), one=False): """ Simple wrapper around query """ cur = g.db.execute(query, args) rv = [dict((cur.description[idx][0], value) for idx, value in enumerate(row)) for row in cur.fetchall()] return (rv[0] if rv else None) if one else rv @app.before_request def before_request(): try: g.db = g._db.cursor() except AttributeError: g._db = connect_db() g.db = g._db.cursor() @app.teardown_request def teardown_request(exception): try: g.db.close() except AttributeError: pass #VIEWS @app.route('/') @app.route('/view') @app.route('/view//') def home(subject= "mechanika", datestring= "14grudnia2012"): other_dates = prepare_other_dates(subject) all_dates = prepare_all_dates() all_subjects = [sub["subject"] for sub in get_all_subjects()] thumbs = get_thumbs(subject, datestring) if datestring in other_dates: other_dates.remove(datestring) thumbs_info = {"subject": subject, "datestring": datestring, "other_dates": other_dates} thumbs = [dict(href=thumb.href, src=thumb.src) for thumb in thumbs] main_page_src=thumbs[0]["href"] return render_template('index.html', thumbs=thumbs, main_page_src=main_page_src,thumbs_info=thumbs_info, all_dates=all_dates, all_subjects=all_subjects) @app.route('/subject/') def show_subject(subject): dates = prepare_other_dates(subject) all_dates = prepare_all_dates() all_subjects = [sub["subject"] for sub in get_all_subjects()] return render_template('subject.html', subject=subject, dates=dates, all_dates=all_dates, all_subjects=all_subjects) @app.route('/date/') def show_date(datestring): all_dates = prepare_all_dates() all_subjects = [sub["subject"] for sub in get_all_subjects()] notes = get_notes_for_day(datestring) separated_notes = {} for note in notes: if not note["subject"] in separated_notes: separated_notes[note["subject"]] = [] separated_notes[note["subject"]].append(note) return render_template('date.html', date=datestring, all_dates=all_dates, all_subjects=all_subjects, separated_notes=separated_notes) @app.route('/search') def show_search(): all_dates = prepare_all_dates() all_subjects = [sub["subject"] for sub in get_all_subjects()] return render_template('search.html', all_dates=all_dates, all_subjects=all_subjects ) @app.route('/about') def about(): all_dates = prepare_all_dates() all_subjects = [sub["subject"] for sub in get_all_subjects()] return render_template('about.html', all_dates=all_dates, all_subjects=all_subjects ) #HELPERS def add_note(subject, datestring, notes): g.db.execute('insert into notes (subject, datestring ) values (?, ?)', [subject, datestring]) note_id = g.db.lastrowid for note in notes: g.db.execute('insert into pages (note_id, name, tags ) values (?, ?, ?)', [note_id, note["name"], note["tags"]]) g._db.commit() def create_thumb(subject, datestring, name, tags, author_string): src = "notes/" + author_string + "/mini/" + subject + "/" + datestring + "/" + name href = "notes/" + author_string + "/" + subject + "/" + datestring + "/" + name thumb = Thumb(src, href, tags) return thumb def get_thumbs(subject, datestring=""): if(datestring==""): query_result = query_db("select pages.* from pages left join notes on notes.id = pages.note_id where notes.subject = ?", [subject,]) else: query_result = query_db("select pages.*, notes.author_string from pages left join notes on notes.id = pages.note_id \ where notes.subject = ? and datestring = ?", [subject, datestring]) return [create_thumb(subject, datestring, t["name"], t["tags"], t["author_string"]) for t in query_result ] def get_possible_dates(subject): dates = query_db("select distinct datestring from notes where subject = ? ", [subject]) return dates def get_notes_for_day(datestring): """return pages which where written that day (daystring) with other info""" query_result = query_db("select pages.*,notes.subject,notes.author_string, notes.author from pages left join notes on notes.id = pages.note_id \ where datestring = ?", [datestring]) return [{"subject": t["subject"], "author_string":t["author_string"], "author":t["author"], "datestring": datestring, "name": t["name"]}for t in query_result ] def get_all_dates(): """return all dates from database""" dates = query_db("select distinct datestring from notes ") return dates def get_all_subjects(): """return all subject from database""" subjects = query_db("select distinct subject from notes ") return subjects def prepare_all_dates(): """return all dates in well formated form of nested dictionaries""" datestrings = [date["datestring"] for date in get_all_dates()] all_dates = [convert_datestring_to_date(date) for date in datestrings] return sort_dates(datestrings, all_dates) def prepare_other_dates(subject): datestrings = [date["datestring"] for date in get_possible_dates(subject)] dates = [convert_datestring_to_date(date) for date in datestrings] return sort_dates(datestrings, dates) def sort_dates(datestrings, dates): sorted_dates = {} for date, datestring in zip(dates, datestrings): if not date.datetime.year in sorted_dates: sorted_dates[date.datetime.year] = {} if not date.datetime.month in sorted_dates[date.datetime.year]: sorted_dates[date.datetime.year][date.datetime.month] = [] sorted_dates[date.datetime.year][date.datetime.month].append({"day" : date.datetime.day, "source": datestring, "weekday": weekday(date.datetime.weekday())}) sorted = sort_number_strings(sorted_dates[date.datetime.year][date.datetime.month]) sorted_dates[date.datetime.year][date.datetime.month] = sorted return sorted_dates def sort_number_strings(data): """return array of dictionaries sorted by day treated as a number, i.e. 12 is after 3.""" number_data = [int(day["day"]) for day in data] number_data.sort() return [{"day": number, "source": data[get_index_for(number, data)]["source"], "weekday": data[get_index_for(number, data)]["weekday"] } for i, number in enumerate(number_data)] def weekday(number): """return name of the weekday for a specific number in range 0-6""" weekdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] return weekdays[number] def get_index_for(number, data): """get index of dictionary which day value equals number""" index = 0 for i, day in enumerate(data): if day["day"] == number: index = i return index if __name__ == '__main__': app.run()