Browse Source

Sanity check in the ISP model

Gu1 11 years ago
parent
commit
ff406e3c72
1 changed files with 17 additions and 1 deletions
  1. 17 1
      ffdnispdb/models.py

+ 17 - 1
ffdnispdb/models.py

@@ -3,11 +3,13 @@
 from decimal import Decimal
 import json
 import os
+import itertools
 from datetime import datetime
 from . import db, app
 import flask_sqlalchemy
 from sqlalchemy.types import TypeDecorator, VARCHAR
 from sqlalchemy.ext.mutable import MutableDict
+from sqlalchemy import event
 import whoosh
 from whoosh import fields, index, qparser
 
@@ -47,7 +49,7 @@ class ISP(db.Model):
     shortname = db.Column(db.String(12), index=True, unique=True)
     is_ffdn_member = db.Column(db.Boolean, default=False)
     is_disabled = db.Column(db.Boolean, default=False) # True = ISP will not appear
-    url = db.Column(db.String)
+    json_url = db.Column(db.String)
     last_update_success = db.Column(db.DateTime)
     last_update_attempt = db.Column(db.DateTime)
     is_updatable = db.Column(db.Boolean, default=True) # set to False to disable JSON-URL updates
@@ -59,6 +61,13 @@ class ISP(db.Model):
         super(ISP, self).__init__(*args, **kwargs)
         self.json={}
 
+    def pre_save(self, *args):
+        if 'name' in self.json:
+            assert self.name == self.json['name']
+
+        if 'shortname' in self.json:
+            assert self.shortname == self.json['shortname']
+
     def covered_areas_names(self):
         return [c['name'] for c in self.json.get('coveredAreas', [])]
 
@@ -81,6 +90,12 @@ class ISP(db.Model):
         return '<ISP %r>' % (self.shortname if self.shortname else self.name,)
 
 
+def pre_save_hook(sess):
+    for v in itertools.chain(sess.new, sess.dirty):
+        if hasattr(v, 'pre_save') and hasattr(v.pre_save, '__call__'):
+            v.pre_save(sess)
+
+
 class ISPWhoosh(object):
     """
     Helper class to index the ISP model with Whoosh to allow full-text search
@@ -174,4 +189,5 @@ class ISPWhoosh(object):
 
 
 flask_sqlalchemy.models_committed.connect(ISPWhoosh._after_flush)
+event.listen(flask_sqlalchemy.Session, 'before_commit', pre_save_hook)