##// END OF EJS Templates
Delete global ID when deleting post. Cache model's content XML tag into global ID
Delete global ID when deleting post. Cache model's content XML tag into global ID

File last commit:

r1520:ecaafe92 decentral
r1520:ecaafe92 decentral
Show More
signature.py
144 lines | 4.1 KiB | text/x-python | PythonLexer
import xml.etree.ElementTree as et
from django.db import models
TAG_MODEL = 'model'
TAG_REQUEST = 'request'
TAG_ID = 'id'
TYPE_GET = 'get'
TYPE_PULL = 'pull'
ATTR_VERSION = 'version'
ATTR_TYPE = 'type'
ATTR_NAME = 'name'
ATTR_KEY = 'key'
ATTR_KEY_TYPE = 'type'
ATTR_LOCAL_ID = 'local-id'
class GlobalIdManager(models.Manager):
def generate_request_get(self, global_id_list: list):
"""
Form a get request from a list of ModelId objects.
"""
request = et.Element(TAG_REQUEST)
request.set(ATTR_TYPE, TYPE_GET)
request.set(ATTR_VERSION, '1.0')
model = et.SubElement(request, TAG_MODEL)
model.set(ATTR_VERSION, '1.0')
model.set(ATTR_NAME, 'post')
for global_id in global_id_list:
tag_id = et.SubElement(model, TAG_ID)
global_id.to_xml_element(tag_id)
return et.tostring(request, 'unicode')
def generate_request_pull(self):
"""
Form a pull request from a list of ModelId objects.
"""
request = et.Element(TAG_REQUEST)
request.set(ATTR_TYPE, TYPE_PULL)
request.set(ATTR_VERSION, '1.0')
model = et.SubElement(request, TAG_MODEL)
model.set(ATTR_VERSION, '1.0')
model.set(ATTR_NAME, 'post')
return et.tostring(request, 'unicode')
def global_id_exists(self, global_id):
"""
Checks if the same global id already exists in the system.
"""
return self.filter(key=global_id.key,
key_type=global_id.key_type,
local_id=global_id.local_id).exists()
class GlobalId(models.Model):
"""
Global model ID and cache.
Key, key type and local ID make a single global identificator of the model.
Content is an XML cache of the model that can be passed along between nodes
without manual serialization each time.
"""
class Meta:
app_label = 'boards'
objects = GlobalIdManager()
def __init__(self, *args, **kwargs):
models.Model.__init__(self, *args, **kwargs)
if 'key' in kwargs and 'key_type' in kwargs and 'local_id' in kwargs:
self.key = kwargs['key']
self.key_type = kwargs['key_type']
self.local_id = kwargs['local_id']
key = models.TextField()
key_type = models.TextField()
local_id = models.IntegerField()
content = models.TextField(blank=True, null=True)
def __str__(self):
return '%s::%s::%d' % (self.key_type, self.key, self.local_id)
def to_xml_element(self, element: et.Element):
"""
Exports global id to an XML element.
"""
element.set(ATTR_KEY, self.key)
element.set(ATTR_KEY_TYPE, self.key_type)
element.set(ATTR_LOCAL_ID, str(self.local_id))
@staticmethod
def from_xml_element(element: et.Element):
"""
Parses XML id tag and gets global id from it.
Arguments:
element -- the XML 'id' element
Returns:
global_id -- id itself
exists -- True if the global id was taken from database, False if it
did not exist and was created.
"""
try:
return GlobalId.objects.get(key=element.get(ATTR_KEY),
key_type=element.get(ATTR_KEY_TYPE),
local_id=int(element.get(
ATTR_LOCAL_ID))), True
except GlobalId.DoesNotExist:
return GlobalId(key=element.get(ATTR_KEY),
key_type=element.get(ATTR_KEY_TYPE),
local_id=int(element.get(ATTR_LOCAL_ID))), False
class Signature(models.Model):
class Meta:
app_label = 'boards'
def __init__(self, *args, **kwargs):
models.Model.__init__(self, *args, **kwargs)
if 'key' in kwargs and 'key_type' in kwargs and 'signature' in kwargs:
self.key_type = kwargs['key_type']
self.key = kwargs['key']
self.signature = kwargs['signature']
key_type = models.TextField()
key = models.TextField()
signature = models.TextField()
global_id = models.ForeignKey('GlobalId')