cygnal/server/models.py

87 lines
1.9 KiB
Python

#!/usr/bin/env python
# coding: utf-8
"""
Models and database definition
"""
import json
import os
import bottle
import peewee
from playhouse.db_url import connect
from playhouse.shortcuts import model_to_dict
from server.tools import UTC_now
db = connect(os.environ.get('DATABASE', 'sqlite:///reports.db'))
@bottle.hook('before_request')
def _connect_db():
db.connect()
@bottle.hook('after_request')
def _close_db():
if not db.is_closed():
db.close()
class BaseModel(peewee.Model):
"""
Common base class for all models
"""
class Meta:
database = db
class Report(BaseModel):
"""
A report object
"""
type = peewee.CharField(max_length=255)
lat = peewee.DoubleField()
lng = peewee.DoubleField()
first_report_datetime = peewee.DateTimeField(
default=UTC_now
)
datetime = peewee.DateTimeField(
default=UTC_now
)
expiration_datetime = peewee.DateTimeField(null=True)
upvotes = peewee.IntegerField(default=0)
downvotes = peewee.IntegerField(default=0)
source = peewee.CharField(max_length=255, default='')
shape_geojson = peewee.TextField(default=None, null=True)
def to_json(self):
return {
"type": "reports",
"id": self.id,
"attributes": {
k: v for k, v in model_to_dict(self).items()
if k != "id"
}
}
def to_geojson_feature(self):
properties = {
"type": "reports",
}
for k, v in model_to_dict(self).items():
properties[k] = v
geometry = None
if self.shape_geojson:
geometry = json.loads(self.shape_geojson)
else:
geometry = {
"type": "Point",
"coordinates": [self.lng, self.lat]
}
return {
"type": "Feature",
"properties": properties,
"geometry": geometry,
}