app.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import flask
  2. import sqlite3
  3. from datetime import datetime
  4. from flask import Flask, render_template, redirect, url_for, request, jsonify
  5. from flask_sqlalchemy import SQLAlchemy
  6. import sqlalchemy.exc
  7. from sqlalchemy_utils import PasswordType
  8. # from sqlalchemy import Column, Integer, String
  9. # from sqlalchemy.ext.declarative import declarative_base
  10. # TODO: sqlalchemy?
  11. # schema:
  12. # Utente: uid, username, password
  13. # TipoRadio: trid, tipo
  14. # Avvistamento: aid, uid, tipo_radio, data, commento
  15. app = Flask(__name__)
  16. app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///map.db"
  17. db = SQLAlchemy(app)
  18. class User(db.Model):
  19. __tablename__ = "user"
  20. uid = db.Column(db.Integer, primary_key=True, nullable=False)
  21. username = db.Column(db.String, unique=True)
  22. password = db.Column(PasswordType(schemes=["pbkdf2_sha512"]))
  23. rapporti = db.relationship("RapportoRicezione")
  24. class TipoRadio(db.Model):
  25. __tablename__ = "tiporadio"
  26. tid = db.Column(db.Integer, primary_key=True, nullable=False)
  27. nome = db.Column(db.Unicode)
  28. descrizione = db.Column(db.Unicode)
  29. rapporti = db.relationship("RapportoRicezione")
  30. class RapportoRicezione(db.Model):
  31. __tablename__ = "rapporto"
  32. rid = db.Column(db.Integer, primary_key=True)
  33. uid = db.Column(db.Integer, db.ForeignKey("user.uid"))
  34. tid = db.Column(db.Integer, db.ForeignKey("tiporadio.tid"))
  35. date = db.Column(db.Date, default=lambda: datetime.now())
  36. lat = db.Column(db.Float)
  37. lng = db.Column(db.Float)
  38. comprensibile = db.Column(db.Integer) # TODO: >= 0 <= 5
  39. stabilita = db.Column(db.Integer) # TODO: >= 0 <= 5
  40. author = db.relationship(User, back_populates="rapporti")
  41. tipo_radio = db.relationship(TipoRadio, back_populates="rapporti")
  42. def serialize(self):
  43. d = {k:v for k,v in self.__dict__.items() if not k.startswith('_')}
  44. d['colore'] = self.colore
  45. d['radius'] = self.radius
  46. d['explaination'] = self.explaination
  47. return d
  48. @property
  49. def colore(self):
  50. c = self.comprensibile
  51. if c > 3:
  52. return 'green'
  53. if c > 1:
  54. return 'yellow'
  55. return 'red'
  56. @property
  57. def radius(self):
  58. return self.stabilita * 70
  59. @property
  60. def explaination(self):
  61. return 'Aggiunto il %s da %s' % (self.date, self.author.username)
  62. def __repr__(self):
  63. return "<Rapporto %s del %s>" % (self.rid, self.date)
  64. @app.before_first_request
  65. def init_db():
  66. db.create_all()
  67. try:
  68. anon = User(username="anonymous", password="antani")
  69. db.session.add(anon)
  70. db.session.commit()
  71. except sqlalchemy.exc.IntegrityError:
  72. db.session.rollback()
  73. for nome in ["radiolina portatile", "autoradio", "stereo fisso dentro casa"]:
  74. try:
  75. t = TipoRadio(nome=nome)
  76. db.session.add(t)
  77. db.session.commit()
  78. except sqlalchemy.exc.IntegrityError:
  79. db.session.rollback()
  80. cnt = int(RapportoRicezione.query.count())
  81. if cnt == 0:
  82. for i in range(6):
  83. r = RapportoRicezione(
  84. uid=User.query.filter(User.username == "anonymous")[0].uid,
  85. tid=TipoRadio.query.all()[0].tid,
  86. stabilita=i,
  87. comprensibile=i,
  88. lat=43.8199 - i * 0.01,
  89. lng=11.22185 + i * 0.03,
  90. )
  91. db.session.add(r)
  92. db.session.commit()
  93. @app.route("/")
  94. def home():
  95. return render_template("index.html")
  96. @app.route("/add")
  97. def add():
  98. return render_template("add.html")
  99. @app.route("/api/rapporti/get")
  100. def get_rapporti():
  101. query = RapportoRicezione.query.all()
  102. # TODO: usa query params per filtrare in base a $cose
  103. return jsonify(dict(rapporti=[r.serialize() for r in query]))
  104. @app.route("/api/rapporti/add", methods=['POST'])
  105. def add_rapporto():
  106. anon = User.query.filter(User.username=='anonymous')[0].uid
  107. r = RapportoRicezione(
  108. uid=anon,
  109. lat=request.form['lat'],
  110. lng=request.form['lng'],
  111. stabilita=request.form['stabilita'],
  112. comprensibile=request.form['comprensibile'],
  113. )
  114. db.session.add(r)
  115. db.session.commit()
  116. r = RapportoRicezione.query.get(r.rid)
  117. return jsonify(r.serialize())
  118. @app.route("/api/rapporti/delete", methods=['POST'])
  119. def delete_rapporto():
  120. r = RapportoRicezione.query.get(int(request.form['rid']))
  121. db.session.delete(r)
  122. db.session.commit()
  123. return jsonify(True)