commissions/app.py

155 lines
5.5 KiB
Python

from flask import Flask, \
render_template as Render,\
redirect as Redirect, \
url_for as MethodUri, \
abort as Abort
from flask_sqlalchemy import SQLAlchemy as DBM
from enum import Enum
from datetime import datetime as DT
from time import sleep
# Init
app=Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI']="sqlite:///app.db"
DB=DBM(app)
#Enums
class WorkState(Enum):
OTHER = 0
IDEA = 1
CONFIRMED = 2
PAID = 3
INPROGRESS = 4
FINISHED = 5
class TxProcessor(Enum):
OTHER = 0
PAYPAL = 1
class TxType(Enum):
OTHER = 0
NORMAL = 1
YCH = 2
YCHAUCTION = 3
class Currency(Enum):
OTHER = 0
GBP = 1
USD = 2
EUR = 3
CAD = 4
class LinkType(Enum):
OTHER = 0
WIPSKETCH = 1
WIPLINES = 2
WIPCOLOUR = 3
WIPSHADING = 4
WIPOTHER = 5
DELIVERABLE = 6
FINAL = 7
#Database stuff
class Artist(DB.Model):
artist_id = DB.Column(DB.Integer, primary_key=True, nullable=False, unique=True)
name = DB.Column(DB.String, nullable=False)
works = DB.relationship("Work", back_populates="artist")
transactions = DB.relationship("Transaction", back_populates="artist")
social_twitter = DB.Column(DB.String)
social_telegram = DB.Column(DB.String)
social_mastodon = DB.Column(DB.String)
social_furaffinity = DB.Column(DB.String)
social_weasyl = DB.Column(DB.String)
social_inkbunny = DB.Column(DB.String)
social_sofurry = DB.Column(DB.String)
social_furrynetwork = DB.Column(DB.String)
class Work(DB.Model):
work_id = DB.Column(DB.Integer, primary_key=True, nullable=False, unique=True)
artist_id = DB.Column(DB.Integer, DB.ForeignKey('artist.artist_id'), nullable=False)
artist = DB.relationship("Artist", back_populates="works", uselist=False)
state = DB.Column(DB.Enum(WorkState), nullable=False)
purchase_type = DB.Column(DB.Enum(TxType),nullable=False)
links = DB.relationship("WorkLink", back_populates="work")
transaction = DB.relationship("Transaction", back_populates="work", uselist=False)
desc = DB.Column(DB.String)
date_proposed = DB.Column(DB.DateTime)
date_accepted = DB.Column(DB.DateTime)
date_paid = DB.Column(DB.DateTime)
date_inprogress = DB.Column(DB.DateTime)
date_completed = DB.Column(DB.DateTime)
class WorkLink(DB.Model):
link_id = DB.Column(DB.Integer, primary_key=True, nullable=False, unique=True)
work_id = DB.Column(DB.Integer, DB.ForeignKey('work.work_id'), nullable=False)
work = DB.relationship("Work", back_populates="links", uselist=False)
linktype = DB.Column(DB.Enum(LinkType), nullable=False)
desc = DB.Column(DB.String, nullable=False)
uri = DB.Column(DB.String, nullable=False)
datetime = DB.Column(DB.DateTime, nullable=False)
class Transaction(DB.Model):
transaction_id = DB.Column(DB.Integer, primary_key=True, nullable=False, unique=True)
artist_id = DB.Column(DB.Integer, DB.ForeignKey('artist.artist_id'), nullable=False)
artist = DB.relationship("Artist", back_populates="transactions", uselist=False)
work_id = DB.Column(DB.Integer, DB.ForeignKey('work.work_id'), nullable=False)
work = DB.relationship("Work", back_populates="transaction", uselist=False)
processor = DB.Column(DB.Enum(TxProcessor), nullable=False)
processor_txid = DB.Column(DB.String, unique=True, nullable=False)
currency = DB.Column(DB.Enum(Currency), nullable=False)
amount = DB.Column(DB.Float, nullable=False)
datetime = DB.Column(DB.DateTime, nullable=False)
#Debugging stuff
def RecreateDB():
DB.drop_all()
DB.create_all()
def PopulateTestData():
RecreateDB()
tArtist=Artist(name="test artist 1")
DB.session.add(tArtist)
DB.session.commit()
tWork=Work(artist_id=tArtist.artist_id,
state=WorkState.FINISHED, purchase_type=TxType.NORMAL, desc="porno?")
tWorkTwo=Work(artist_id=tArtist.artist_id,
state=WorkState.INPROGRESS, purchase_type=TxType.YCHAUCTION)
DB.session.add_all((tWork, tWorkTwo))
DB.session.commit()
DB.session.add(WorkLink(work_id=tWork.work_id, linktype=LinkType.DELIVERABLE,
uri="rick astley dot com", desc="cool website", datetime=DT.utcnow()))
DB.session.add(WorkLink(work_id=tWork.work_id, linktype=LinkType.WIPSKETCH,
uri="rick astley dot com", desc="cool website", datetime=DT.utcnow()))
DB.session.commit()
DB.session.add(Transaction(artist_id=tArtist.artist_id, work_id=tWork.work_id,
currency=Currency.GBP, amount=69.42, processor=TxProcessor.PAYPAL,
processor_txid="1A7489327fuck", datetime=DT.utcnow()))
DB.session.commit()
#Routes
@app.route('/')
def index():
_idea=Work.query.filter_by(state=WorkState.IDEA).join(Artist)
_conf=Work.query.filter(
(Work.state==WorkState.CONFIRMED) |
(Work.state==WorkState.PAID)).join(Artist)
_inp=Work.query.filter_by(state=WorkState.INPROGRESS).join(Artist)
_cmp=Work.query.filter_by(state=WorkState.FINISHED).join(Artist)
return Render("index.html.j2", ideas=_idea, cnfpaid=_conf, inprog=_inp, done=_cmp)
@app.route('/list/<listname>')
def list(listname=None):
_p=Work.query.filter_by(state=WorkState.FINISHED)
return Render("list.html.j2", workslist=listname, works=_p.all())
@app.route('/add')
def add(): return Render("add.html.j2")
@app.route('/update', methods=['POST'])
def update(): return Redirect(MethodUri('index'))
@app.route('/work/<id>')
def view_work(id=None): return True
@app.route('/artist/<id>')
def view_artist(id=None):
_a=Artist.query.filter_by(artist_id=id).first()
_w=Work.query.filter_by(artist_id=id).all()
_t=Transaction.query.filter_by(artist_id=id).all()
return Render("artist.html.j2", ainfo=_a, works=_w, txes=_t)