From 5529b2ac81d74fc1a6e5ee6da879d0dfae261235 Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Tue, 21 Oct 2008 19:15:05 +0000 Subject: [PATCH] support user created conf_files for slices --- PLC/ConfFiles.py | 22 +++++++++++++++++++++- PLC/Methods/AddConfFile.py | 8 ++++++-- PLC/Methods/UpdateConfFile.py | 18 +++++++++++++----- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/PLC/ConfFiles.py b/PLC/ConfFiles.py index f15a574..5d8ae17 100644 --- a/PLC/ConfFiles.py +++ b/PLC/ConfFiles.py @@ -36,7 +36,12 @@ class ConfFile(Row): 'error_cmd': Parameter(str, "Shell command to execute if any error occurs", max = 1024, nullok = True), 'ignore_cmd_errors': Parameter(bool, "Install file anyway even if an error occurs"), 'always_update': Parameter(bool, "Always attempt to install file even if unchanged"), - 'node_ids': Parameter(int, "List of nodes linked to this file"), + 'site_id': Parameter(int, "Identifier of the site to which this conf file belongs"), + 'creator_id': Parameter(int, "Identifer of the person who created this conf file"), + 'last_modified_by_id': Parameter(int, "Identifier of the person who last updated this conf file"), + 'date_created': Parameter(int, "Date and time when this conf file was created", ro = True), + 'last_modified': Parameter(int, "Date and time when this conf file was last modified", ro = True), + 'node_ids': Parameter(int, "List of nodes linked to this file"), 'nodegroup_ids': Parameter(int, "List of node groups linked to this file"), } @@ -134,6 +139,21 @@ class ConfFile(Row): self['nodegroup_ids'].remove(nodegroup_id) nodegroup['conf_file_ids'].remove(conf_file_id) + def update_last_modified(): + """ + Update last_updated field with current time + """ + + assert 'conf_file_id' in self + assert self.table_name + + self.api.db.do("UPDATE %s SET last_modified = CURRENT_TIMESTAMP " % (self.table_name) + \ + " where conf_file_id = %d" % (self['conf_file_id']) ) + self.sync(commit) + + validate_date_created = Row.validate_timestamp + validate_last_updated = Row.validate_timestamp + class ConfFiles(Table): """ Representation of the conf_files table in the database. diff --git a/PLC/Methods/AddConfFile.py b/PLC/Methods/AddConfFile.py index 5604cef..96b33f8 100644 --- a/PLC/Methods/AddConfFile.py +++ b/PLC/Methods/AddConfFile.py @@ -5,7 +5,7 @@ from PLC.ConfFiles import ConfFile, ConfFiles from PLC.Auth import Auth can_update = lambda (field, value): field not in \ - ['conf_file_id', 'node_ids', 'nodegroup_ids'] + ['conf_file_id', 'node_ids', 'nodegroup_ids', 'creator_id', 'last_modified_by_id'] class AddConfFile(Method): """ @@ -15,7 +15,7 @@ class AddConfFile(Method): Returns the new conf_file_id (> 0) if successful, faults otherwise. """ - roles = ['admin'] + roles = ['admin', 'pi', 'user'] conf_file_fields = dict(filter(can_update, ConfFile.fields.items())) @@ -30,6 +30,10 @@ class AddConfFile(Method): def call(self, auth, conf_file_fields): conf_file_fields = dict(filter(can_update, conf_file_fields.items())) conf_file = ConfFile(self.api, conf_file_fields) + conf_file['creator_id'] = self.caller['person_id'] + conf_file['last_modified_by_id'] = self.caller['person_id'] + if 'site_id' not in conf_file_fields: + conf_file['site_id'] = self.caller['site_ids'][0] conf_file.sync() self.event_objects = {'ConfFile': [conf_file['conf_file_id']]} diff --git a/PLC/Methods/UpdateConfFile.py b/PLC/Methods/UpdateConfFile.py index 6fd0e2a..a76e353 100644 --- a/PLC/Methods/UpdateConfFile.py +++ b/PLC/Methods/UpdateConfFile.py @@ -5,7 +5,7 @@ from PLC.ConfFiles import ConfFile, ConfFiles from PLC.Auth import Auth can_update = lambda (field, value): field not in \ - ['conf_file_id', 'node_ids', 'nodegroup_ids'] + ['conf_file_id', 'node_ids', 'nodegroup_ids', 'creator_id', 'last_modified_by_id'] class UpdateConfFile(Method): """ @@ -15,7 +15,7 @@ class UpdateConfFile(Method): Returns 1 if successful, faults otherwise. """ - roles = ['admin'] + roles = ['admin', 'pi', 'user'] conf_file_fields = dict(filter(can_update, ConfFile.fields.items())) @@ -31,11 +31,19 @@ class UpdateConfFile(Method): conf_file_fields = dict(filter(can_update, conf_file_fields.items())) conf_files = ConfFiles(self.api, [conf_file_id]) + if not conf_files: raise PLCInvalidArgument, "No such configuration file" - - conf_file = conf_files[0] - conf_file.update(conf_file_fields) + + conf_file = conf_files[0] + + if 'admin' not in self.caller['roles']: + if conf_file['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to update that conf file" + + conf_file.update(conf_file_fields) + conf_file['last_modified_by_id'] = self.caller['person_id'] + conf_file.update_last_modified(commit = False) conf_file.sync() self.event_objects = {'ConfFile': [conf_file['conf_file_id']]} -- 2.43.0