text: #!/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,
          }
  