freezer-web-ui/freezer_ui/utils.py

157 lines
4.2 KiB
Python

# (c) Copyright 2014,2015 Hewlett-Packard Development Company, L.P.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import uuid
import datetime
from django.template.defaultfilters import date as django_date
def create_dict_action(**kwargs):
"""Create a dict only with values that exists so we avoid send keys with
None values
"""
return {k: v for k, v in kwargs.items() if v}
def timestamp_to_string(ts):
return django_date(
datetime.datetime.fromtimestamp(int(ts)),
'SHORT_DATETIME_FORMAT')
class Dict2Object(object):
"""Makes dictionary fields accessible as if they are attributes.
The dictionary keys become class attributes. It is possible to use one
nested dictionary by overwriting nested_dict with the key of that nested
dict.
This class is needed because we mostly deal with objects in horizon (e.g.
for providing data to the tables) but the api only gives us json data.
"""
nested_dict = None
def __init__(self, data_dict):
self.data_dict = data_dict
def __getattr__(self, attr):
"""Make data_dict fields available via class interface """
if attr in self.data_dict:
return self.data_dict[attr]
elif attr in self.data_dict[self.nested_dict]:
return self.data_dict[self.nested_dict][attr]
else:
return object.__getattribute__(self, attr)
def get_dict(self):
return self.data_dict
class Action(Dict2Object):
nested_dict = 'job_action'
@property
def id(self):
return self.job_id
class Job(Dict2Object):
nested_dict = 'job_actions'
@property
def id(self):
return self.job_id
class Backup(Dict2Object):
nested_dict = 'backup_metadata'
@property
def id(self):
return self.backup_id
class Client(object):
def __init__(self, uuid, hostname, client_id):
self.uuid = uuid
self.hostname = hostname
self.client_id = client_id
self.id = client_id
class ActionJob(object):
def __init__(self, job_id, action_id, action, backup_name):
self.job_id = job_id
self.action_id = action_id
self.action = action
self.backup_name = backup_name
class Session(object):
def __init__(self, session_id, description, status, jobs,
start_datetime, interval, end_datetime):
self.session_id = session_id
self.description = description
self.status = status
self.jobs = jobs
self.start_datetime = start_datetime
self.interval = interval
self.end_datetime = end_datetime
class SessionJob(object):
"""Create a job object to work with in horizon"""
def __init__(self, job_id, session_id, client_id, status):
self.job_id = job_id
self.session_id = session_id
self.client_id = client_id
self.status = status
class JobList(object):
"""Create an object to be passed to horizon tables that handles
nested values
"""
def __init__(self, description, result, job_id):
self.description = description
self.result = result
self.id = job_id
self.job_id = job_id
def create_dummy_id():
"""Generate a dummy id for documents generated by the scheduler.
This is needed when the scheduler creates jobs with actions attached
directly, those actions are not registered in the db.
"""
return uuid.uuid4().hex
def actions_in_job(ids):
"""Return an ordered list of actions for a new job
"""
ids = ids.split('===')
return [i for i in ids if i]
def assign_value_from_source(source_dict, dest_dict, key):
"""Assign a value to a destination dict from a source dict
if the key exists
"""
if key in source_dict:
dest_dict[key] = source_dict.pop(key)