summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRené 'Necoro' Neumann <necoro@necoro.net>2017-03-11 15:21:12 +0100
committerRené 'Necoro' Neumann <necoro@necoro.net>2017-03-11 15:21:12 +0100
commit270bf999e8cfed700c3639b564f17135e67238a2 (patch)
tree91083e8351e55a038d17737426af39fb92f90fcd
parentabdcbf3a7e4dc4fe55042b915befa5d3e0556f17 (diff)
downloadarchivist-270bf999e8cfed700c3639b564f17135e67238a2.tar.gz
archivist-270bf999e8cfed700c3639b564f17135e67238a2.tar.bz2
archivist-270bf999e8cfed700c3639b564f17135e67238a2.zip
Roll our own version of create_or_get, replacing the one broken/removed one from Peewee
-rw-r--r--archivist/model.py25
1 files changed, 25 insertions, 0 deletions
diff --git a/archivist/model.py b/archivist/model.py
index fa24304..b76783e 100644
--- a/archivist/model.py
+++ b/archivist/model.py
@@ -28,6 +28,29 @@ def drop_tables():
db.drop_tables(__tables__, True)
class BaseModel(Model):
+ __keys__ = []
+
+ @classmethod
+ def try_create(cls, **kwargs):
+ try:
+ return cls.create(**kwargs)
+ except IntegrityError:
+ return None
+
+ @classmethod
+ def create_or_get(cls, **kwargs):
+ if not __keys__:
+ raise ValueError("create_or_get not supported on %s" % cls.__name__)
+ for key in __keys__:
+ if key not in kwargs:
+ raise ValueError("required key '%s' missing" % key)
+
+ try:
+ return cls.create(**kwargs), True
+ except IntegrityError:
+ sel = {k:kwargs[k] for k in __keys__}
+ return cls.get(**sel), False
+
class Meta:
database = db
@@ -61,6 +84,7 @@ class Document(BaseModel):
@table
class Prefix(BaseModel):
+ __keys__ = ('name',)
name = CharField(primary_key = True)
virtual = BooleanField(default = False)
description = CharField(null=True)
@@ -84,6 +108,7 @@ class Prefix(BaseModel):
@table
class Tag(BaseModel):
+ __keys__ = ('name', 'prefix')
name = CharField()
prefix = ForeignKeyField(Prefix, null=True, related_name = 'tag', db_column = 'prefix')
description = CharField(null=True)