aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorMilo Casagrande <milo.casagrande@linaro.org>2014-11-06 16:19:54 +0100
committerMilo Casagrande <milo.casagrande@linaro.org>2014-11-06 16:20:37 +0100
commitb199ffd3901e4614e2cad2bce420cfebaa4e9665 (patch)
treeefc305cc17403215c236185b62a6330f4f7e9298 /app
parentb9a32346a62647f2b45e1669b0091352ae4cd598 (diff)
subscription: Model refactoring.
Change-Id: I19444d61c77f59ff9174f5380ae8365882d60582
Diffstat (limited to 'app')
-rw-r--r--app/models/__init__.py2
-rw-r--r--app/models/subscription.py122
-rw-r--r--app/models/tests/test_subscription_model.py (renamed from app/models/tests/test_models.py)111
-rw-r--r--app/tests/__init__.py2
4 files changed, 161 insertions, 76 deletions
diff --git a/app/models/__init__.py b/app/models/__init__.py
index 3d43a9e..1366962 100644
--- a/app/models/__init__.py
+++ b/app/models/__init__.py
@@ -44,6 +44,7 @@ DOC_ID_KEY = 'doc_id'
DTB_ADDR_KEY = 'dtb_addr'
DTB_KEY = 'dtb'
EMAIL_KEY = 'email'
+EMAIL_LIST_KEY = 'emails'
ENDIANNESS_KEY = 'endian'
ERRORS_KEY = 'errors'
EXPIRED_KEY = 'expired'
@@ -142,6 +143,7 @@ BISECT_BAD_COMMIT_URL = 'bad_commit_url'
JOB_DOCUMENT_NAME = '%(job)s-%(kernel)s'
BOOT_DOCUMENT_NAME = '%(board)s-%(job)s-%(kernel)s-%(defconfig)s'
DEFCONFIG_DOCUMENT_NAME = '%(job)s-%(kernel)s-%(defconfig)s'
+SUBSCRIPTION_DOCUMENT_NAME = 'sub-%(job)s-%(kernel)s'
# Valid build status.
VALID_BUILD_STATUS = [
diff --git a/app/models/subscription.py b/app/models/subscription.py
index 66cd136..3960c6c 100644
--- a/app/models/subscription.py
+++ b/app/models/subscription.py
@@ -1,5 +1,3 @@
-# Copyright (C) 2014 Linaro Ltd.
-#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
@@ -21,36 +19,92 @@ import types
from bson import json_util
-from models import (
- ID_KEY,
- SUBSCRIPTION_COLLECTION,
-)
-from models.base import BaseDocument
+import models
+import models.base as modb
-class SubscriptionDocument(BaseDocument):
+class SubscriptionDocument(modb.BaseDocument):
"""This class represents a subscription document in the mongodb database.
A subscription document contains a list of emails that shoule be notified.
It contains an external ID that points to the job ID.
"""
- SUBSCRIPTION_ID_FORMAT = 'sub-%s'
-
- def __init__(self, name, job_id):
- super(SubscriptionDocument, self).__init__(name)
- self._job_id = job_id
+ def __init__(self, job, kernel):
+ doc_name = {
+ models.JOB_KEY: job,
+ models.KERNEL_KEY: kernel
+ }
+ self._name = models.SUBSCRIPTION_DOCUMENT_NAME % doc_name
+ self._created_on = None
+ self._id = None
+ self._job_id = None
+ self._job = job
+ self._kernel = kernel
self._emails = []
@property
def collection(self):
- return SUBSCRIPTION_COLLECTION
+ return models.SUBSCRIPTION_COLLECTION
+
+ @property
+ def name(self):
+ """The name of the object."""
+ return self._name
+
+ @name.setter
+ def name(self, value):
+ """Set the name of the document."""
+ self._name = value
+
+ @property
+ def id(self):
+ """The ID of this object as returned by mongodb."""
+ return self._id
+
+ @id.setter
+ def id(self, value):
+ """Set the ID of this object with the ObjectID from mongodb.
+
+ :param value: The ID of this object.
+ :type value: str
+ """
+ self._id = value
+
+ @property
+ def job(self):
+ """The real job name as found on the file system."""
+ return self._job
+
+ @property
+ def kernel(self):
+ """The real kernel name as found on the file system."""
+ return self._kernel
+
+ @property
+ def created_on(self):
+ """When this object was created."""
+ return self._created_on
+
+ @created_on.setter
+ def created_on(self, value):
+ """Set the creation date of this object.
+
+ :param value: The lab creation date, in UTC time zone.
+ :type value: datetime
+ """
+ self._created_on = value
@property
def job_id(self):
"""The job ID this subscriptions belong to."""
return self._job_id
+ @job_id.setter
+ def job_id(self, value):
+ """Set the ID of the associated job."""
+ self._job_id = value
+
@property
def emails(self):
"""The list of emails subscribed."""
@@ -70,9 +124,18 @@ class SubscriptionDocument(BaseDocument):
self._emails = list(set(self._emails))
def to_dict(self):
- sub_dict = super(SubscriptionDocument, self).to_dict()
- sub_dict['emails'] = self._emails
- sub_dict['job_id'] = self._job_id
+ sub_dict = {
+ models.CREATED_KEY: self.created_on,
+ models.EMAIL_LIST_KEY: self.emails,
+ models.JOB_ID_KEY: self.job_id,
+ models.JOB_KEY: self.job,
+ models.KERNEL_KEY: self.kernel,
+ models.NAME_KEY: self.name,
+ }
+
+ if self.id:
+ sub_dict[models.ID_KEY] = self.id
+
return sub_dict
@staticmethod
@@ -82,15 +145,26 @@ class SubscriptionDocument(BaseDocument):
:param json_obj: The JSON object to start from.
:return An instance of `SubscriptionDocument`.
"""
+ sub_doc = None
+
if isinstance(json_obj, types.StringTypes):
json_obj = json_util.loads(json_obj)
- name = json_obj.pop(ID_KEY)
- job_id = json_obj.pop('job_id')
-
- sub_doc = SubscriptionDocument(name, job_id)
-
- for key, value in json_obj.iteritems():
- setattr(sub_doc, key, value)
+ if isinstance(json_obj, types.DictionaryType):
+ json_pop = json_obj.pop
+ job = json_pop(models.JOB_KEY)
+ kernel = json_pop(models.KERNEL_KEY)
+ doc_id = json_pop(models.ID_KEY)
+ # Remove the name key.
+ json_pop(models.NAME_KEY)
+
+ sub_doc = SubscriptionDocument(job, kernel)
+ sub_doc.id = doc_id
+
+ for key, value in json_obj.iteritems():
+ try:
+ setattr(sub_doc, key, value)
+ except AttributeError:
+ print key
return sub_doc
diff --git a/app/models/tests/test_models.py b/app/models/tests/test_subscription_model.py
index c4b1d66..e02dfc6 100644
--- a/app/models/tests/test_models.py
+++ b/app/models/tests/test_subscription_model.py
@@ -1,5 +1,3 @@
-# Copyright (C) 2014 Linaro Ltd.
-#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
@@ -16,99 +14,110 @@
import types
import unittest
-from bson import (
- json_util,
-)
+from bson import json_util
-from models.base import BaseDocument
-from models.subscription import SubscriptionDocument
+import models.base as modb
+import models.subscription as mods
class TestSubscriptionModel(unittest.TestCase):
def test_subscription_document_emails_attribute(self):
- sub_doc = SubscriptionDocument('sub', 'job')
+ sub_doc = mods.SubscriptionDocument("job", "kernel")
self.assertIsInstance(sub_doc.emails, types.ListType)
self.assertItemsEqual([], sub_doc.emails)
def test_subscription_document_emails_attribute_set(self):
- sub_doc = SubscriptionDocument('sub', 'job')
+ sub_doc = mods.SubscriptionDocument("job", "kernel")
self.assertIsInstance(sub_doc.emails, types.ListType)
self.assertNotIsInstance(sub_doc.emails, types.StringTypes)
def test_subscription_document_emails_extended(self):
- sub_doc = SubscriptionDocument('sub', 'job')
- sub_doc.emails = 'email2'
+ sub_doc = mods.SubscriptionDocument("job", "kernel")
+ sub_doc.emails = "email2"
self.assertIsInstance(sub_doc.emails, types.ListType)
- self.assertEquals(['email2'], sub_doc.emails)
+ self.assertEquals(["email2"], sub_doc.emails)
def test_subscription_document_emails_setter_str(self):
- sub_doc = SubscriptionDocument('sub', 'job')
- sub_doc.emails = 'an_email'
+ sub_doc = mods.SubscriptionDocument("job", "kernel")
+ sub_doc.emails = "an_email"
self.assertIsInstance(sub_doc.emails, types.ListType)
- self.assertEqual(['an_email'], sub_doc.emails)
+ self.assertEqual(["an_email"], sub_doc.emails)
def test_subscription_document_emails_setter_tuple(self):
- sub_doc = SubscriptionDocument('sub', 'job')
- sub_doc.emails = ('an_email', 'another_email')
+ sub_doc = mods.SubscriptionDocument("sub", "job")
+ sub_doc.emails = ("an_email", "another_email")
self.assertIsInstance(sub_doc.emails, types.ListType)
- self.assertEqual(['an_email', 'another_email'], sub_doc.emails)
+ self.assertEqual(["an_email", "another_email"], sub_doc.emails)
def test_subscription_document_to_dict(self):
- expected = dict(_id='sub', emails=[], job_id='job', created_on=None)
- sub_doc = SubscriptionDocument('sub', 'job')
+ expected = {
+ "job": "job",
+ "kernel": "kernel",
+ "name": "sub-job-kernel",
+ "emails": [],
+ "job_id": None,
+ "created_on": None
+ }
+ sub_doc = mods.SubscriptionDocument("job", "kernel")
self.assertEqual(expected, sub_doc.to_dict())
- def test_subscription_document_to_json(self):
- expected = (
- '{"created_on": null, "_id": "sub", "emails": [], "job_id": "job"}'
- )
- sub_doc = SubscriptionDocument('sub', 'job')
- self.assertEqual(expected, sub_doc.to_json())
-
def test_subscription_document_from_json(self):
- json_str = (
- '{"_id": "sub", "emails": [], "job_id": "job"}'
- )
- json_obj = json_util.loads(json_str)
-
- sub_doc = SubscriptionDocument.from_json(json_obj)
-
- self.assertIsInstance(sub_doc, SubscriptionDocument)
- self.assertIsInstance(sub_doc, BaseDocument)
-
- self.assertEqual(sub_doc.name, 'sub')
- self.assertEqual(sub_doc.job_id, 'job')
+ json_obj = {
+ "_id": "id",
+ "name": "sub-job-kernel",
+ "job": "job",
+ "kernel": "kernel",
+ "emails": [],
+ "job_id": "job-id",
+ "cerated_on": "now"
+ }
+
+ sub_doc = mods.SubscriptionDocument.from_json(json_obj)
+
+ self.assertIsInstance(sub_doc, mods.SubscriptionDocument)
+ self.assertIsInstance(sub_doc, modb.BaseDocument)
+
+ self.assertEqual(sub_doc.name, 'sub-job-kernel')
+ self.assertEqual(sub_doc.job_id, 'job-id')
self.assertIsInstance(sub_doc.emails, types.ListType)
def test_subscription_document_from_json_with_emails(self):
- json_obj = dict(
- _id='sub',
- job_id='job',
- emails=['a@example.org', 'b@example.org'],
- created_on=None,
- )
-
- sub_doc = SubscriptionDocument.from_json(json_obj)
+ json_obj = {
+ "_id": "id",
+ "job_id": "job-id",
+ "name": "sub-job-kernel",
+ "job": "job",
+ "kernel": "kernel",
+ "created_on": None,
+ "emails": [
+ "a@example.org", "b@example.org"
+ ]
+ }
+
+ sub_doc = mods.SubscriptionDocument.from_json(json_obj)
self.assertIsInstance(sub_doc.emails, types.ListType)
self.assertEqual(len(sub_doc.emails), 2)
def test_subscription_doc_from_json_string(self):
json_obj = dict(
- _id='sub',
- job_id='job',
+ _id='id',
+ job="job",
+ kernel="kernel",
+ name="sub-job-kernel",
+ job_id='job-id',
emails=['a@example.org', 'b@example.org'],
created_on=None,
)
json_string = json_util.dumps(json_obj)
- sub_doc = SubscriptionDocument.from_json(json_string)
+ sub_doc = mods.SubscriptionDocument.from_json(json_string)
- self.assertIsInstance(sub_doc, SubscriptionDocument)
+ self.assertIsInstance(sub_doc, mods.SubscriptionDocument)
self.assertIsInstance(sub_doc.emails, types.ListType)
diff --git a/app/tests/__init__.py b/app/tests/__init__.py
index 089d5c1..18ad1ff 100644
--- a/app/tests/__init__.py
+++ b/app/tests/__init__.py
@@ -35,7 +35,7 @@ def test_modules():
'models.tests.test_defconfig_model',
'models.tests.test_job_model',
'models.tests.test_lab_model',
- 'models.tests.test_models',
+ 'models.tests.test_subscription_model',
'models.tests.test_token_model',
'utils.batch.tests.test_batch_common',
'utils.bisect.tests.test_bisect',