def _render(cls, resource, data, meta_data, format=None): """ Method to pre-render the contents for the message template @param resource: the S3Resource @param data: the data returned from S3Resource.select @param meta_data: the meta data for the notification @param format: the contents format ("text" or "html") """ created_on_selector = resource.prefix_selector("created_on") created_on_colname = None notify_on = meta_data["notify_on"] last_check_time = meta_data["last_check_time"] rows = data["rows"] rfields = data["rfields"] output = {} new, upd = [], [] if format == "html": # Pre-formatted HTML colnames = [] new_headers = TR() mod_headers = TR() for rfield in rfields: if rfield.selector == created_on_selector: created_on_colname = rfield.colname elif rfield.ftype != "id": colnames.append(rfield.colname) label = rfield.label new_headers.append(TH(label)) mod_headers.append(TH(label)) for row in rows: append_record = upd.append if created_on_colname: try: created_on = row["_row"][created_on_colname] except KeyError, AttributeError: pass else: if s3_utc(created_on) >= last_check_time: append_record = new.append tr = TR([TD(XML(row[colname])) for colname in colnames]) append_record(tr) if "new" in notify_on and len(new): output["new"] = len(new) output["new_records"] = TABLE(THEAD(new_headers), TBODY(new)) else: output["new"] = None if "upd" in notify_on and len(upd): output["upd"] = len(upd) output["upd_records"] = TABLE(THEAD(new_headers), TBODY(upd)) else: output["upd"] = None
def onconflict(cls, item, repository, resource): """ Automatic conflict resolution @param item: the conflicting import item @param repository: the repository the item comes from @param resource: the resource the item shall be imported to """ s3db = current.s3db tablename = resource.tablename resolver = s3db.get_config(tablename, "onconflict") _debug("Resolving conflict in %s", resource.tablename) _debug("Repository: %s", repository.name) _debug("Conflicting item: %s", item) _debug("Method: %s", item.method) if resolver: _debug("Applying custom rule") resolver(item, repository, resource) if item.conflict: _debug("Do not accept") else: _debug("Accept per custom rule") else: _debug("Applying default rule") ttable = s3db.sync_task policies = S3ImportItem.POLICY query = (ttable.repository_id == repository.id) & \ (ttable.resource_name == tablename) & \ (ttable.deleted != True) task = current.db(query).select(limitby=(0, 1)).first() if task and item.original: original = item.original conflict_policy = task.conflict_policy if conflict_policy == policies.OTHER: # Always accept _debug("Accept by default") item.conflict = False elif conflict_policy == policies.NEWER: # Accept if newer xml = current.xml if xml.MTIME in original and \ s3_utc(original[xml.MTIME]) <= item.mtime: _debug("Accept because newer") item.conflict = False else: _debug("Do not accept") elif conflict_policy == policies.MASTER: # Accept if master if current.xml.MCI in original and \ original.mci == 0 or item.mci == 1: _debug("Accept because master") item.conflict = False else: _debug("Do not accept") else: # Never accept _debug("Do not accept") pass else: # No rule - accept always _debug("Accept because no rule found") item.conflict = False
def onconflict(self, item, repository, resource): """ Automatic conflict resolution @param item: the conflicting import item @param repository: the repository the item comes from @param resource: the resource the item shall be imported to """ s3db = current.s3db tablename = resource.tablename resolver = s3db.get_config(tablename, "onconflict") _debug("Resolving conflict in %s" % resource.tablename) _debug("Repository: %s" % repository.name) _debug("Conflicting item: %s" % item) _debug("Method: %s" % item.method) if resolver: _debug("Applying custom rule") resolver(item, repository, resource) if item.conflict: _debug("Do not accept") else: _debug("Accept per custom rule") else: _debug("Applying default rule") ttable = s3db.sync_task policies = S3ImportItem.POLICY query = (ttable.repository_id == repository.id) & \ (ttable.resource_name == tablename) & \ (ttable.deleted != True) task = current.db(query).select(limitby=(0, 1)).first() if task and item.original: original = item.original conflict_policy = task.conflict_policy if conflict_policy == policies.OTHER: # Always accept _debug("Accept by default") item.conflict = False elif conflict_policy == policies.NEWER: # Accept if newer xml = current.xml if xml.MTIME in original and \ s3_utc(original[xml.MTIME]) <= item.mtime: _debug("Accept because newer") item.conflict = False else: _debug("Do not accept") elif conflict_policy == policies.MASTER: # Accept if master if current.xml.MCI in original and \ original.mci == 0 or item.mci == 1: _debug("Accept because master") item.conflict = False else: _debug("Do not accept") else: # Never accept _debug("Do not accept") pass else: # No rule - accept always _debug("Accept because no rule found") item.conflict = False
for rfield in rfields: if rfield.selector == created_on_selector: created_on_colname = rfield.colname elif rfield.ftype != "id": append((rfield.colname, rfield.label)) for row in rows: append_record = upd.append if created_on_colname: try: created_on = row["_row"][created_on_colname] except KeyError, AttributeError: pass else: if s3_utc(created_on) >= last_check_time: append_record = new.append record = [] append_column = record.append for colname, label in labels: append_column((label, row[colname])) append_record(record) if "new" in notify_on and len(new): output["new"] = len(new) output["new_records"] = new else: output["new"] = None if "upd" in notify_on and len(upd): output["upd"] = len(upd)