Files
old-krovovi-kalkulator/helix/session_manager.py
2018-01-15 13:31:00 +01:00

340 lines
17 KiB
Python

import json
import uuid
import os
from helix.constants.anchor_type import AnchorType
from helix.constants.module_type import ModuleType
from helix.constants.system_type import SystemType
from helix.models.sql.inverter_brands import InverterBrand
from helix.models.sql.inverters import Inverter
from helix.models.sql.power_monitors import PowerMonitor
from helix.models.sql.inverter_brands import InverterBrand
from helix.models.sql.power_stations import PowerStation
from helix.models.sql.sites import Site
from helix.models.sql.standalone_inverters import StandaloneInverter
from helix.models.sql.users import User
from helix.store import Store
from helix.user_values import UserValues
class SessionManager(object):
def __init__(self, session, raw_redis_store, db_session):
self.session = session
if 'id' not in session:
session['id'] = uuid.uuid4().hex
self.db_session = db_session
self.user = self.db_session.query(User).filter_by(username=session['id']).first()
if not self.user:
self.user = User(username=session['id'], password_hash='blah')
self.db_session.add(self.user)
self.db_session.commit()
self.site = None
else:
self.site = self.db_session.query(Site).filter_by(user_id=self.user.id).first()
self.store = Store(raw_redis_store, session['id'])
def context(self):
if self.site:
inverter_brands = [inverter_brands.to_json() for inverter_brands in self.db_session.query(InverterBrand).filter_by(site_id=self.site.id).order_by(InverterBrand.id).all()]
power_stations = [power_station.to_json() for power_station in self.db_session.query(PowerStation).filter_by(site_id=self.site.id).order_by(PowerStation.id).all()]
standalone_inverters = [standalone_inverter.to_json() for standalone_inverter in self.db_session.query(StandaloneInverter).filter_by(site_id=self.site.id).order_by(StandaloneInverter.id).all()]
monitors = [monitor.to_json() for monitor in self.db_session.query(PowerMonitor).filter_by(site_id=self.site.id).order_by(PowerMonitor.id).all()]
else:
inverter_brands = []
power_stations = []
standalone_inverters = []
monitors = []
site_data_available = self.site is not None
csv_available = self.site.cad_file is not None if self.site else False
return {
'id': self.session['id'],
'google_analytics_token': os.getenv('GOOGLE_ANALYTICS', ''),
'csv_available': csv_available,
'site_data_available': site_data_available,
'inverter_brands': inverter_brands,
'power_stations': power_stations,
'standalone_inverters': standalone_inverters,
'power_monitors': monitors,
'system_type': SystemType(self.site.system_type) if self.site else SystemType.dualTilt,
'steps': [
(1, 'Site Characterization', '/site_characterization/', site_data_available),
(2, 'Site Summary', '/summary/', site_data_available),
(3, 'Array Summary', '/array_summary/', csv_available),
(4, 'Power Station Configuration', '/power_station_configuration/',
True if power_stations or standalone_inverters else False),
(5, 'Download', '/download/', None)
]
}
def user_values(self):
return UserValues(self.store, self.site)
def save_form_submission(self, form_data):
if not self.site:
self.site = Site(
user_id=self.user.id,
project_name=form_data.get('project_name', ''),
building_height=form_data.get('building_height', 0),
building_width=form_data.get('building_width', 0),
building_length=form_data.get('building_length', 0),
parapet_height=form_data.get('parapet_height', form_data.get('building_parapet_height', 0)),
wind_speed=form_data.get('wind_speed', 0),
exposure_category=form_data.get('exposure_category', 'C'),
exposure_transition_distance=form_data.get('exposure_category_transition_distance', 0),
ballast_block_weight=form_data.get('ballast_block_weight', form_data.get('ballast_weight', 0)),
max_psf=form_data.get('system_pressure', form_data.get('max_system_pressure', form_data.get('max_psf', 0))),
system_type=form_data.get('system_type', SystemType.dualTilt.value),
module_type=form_data.get('module_type', ModuleType.Cell96.value),
anchor_type=form_data.get('anchor_type', AnchorType.OMG_PowerGrip_Plus.value),
spectral_response=form_data.get('design_spectral_response', form_data.get('spectral_response_acceleration', form_data.get('spectral_response', 1))),
seismic_importance_factor=form_data.get('seismic_importance_factor', form_data.get('importance_factor', 1))
)
self.db_session.add(self.site)
self.db_session.commit()
else:
old_system_type = self.site.system_type
old_module_type = self.site.module_type
self.site.project_name = form_data.get('project_name', self.site.project_name)
self.site.building_height = form_data.get('building_height', self.site.building_height)
self.site.building_width = form_data.get('building_width', self.site.building_width)
self.site.building_length = form_data.get('building_length', self.site.building_length)
self.site.parapet_height = form_data.get('building_parapet_height', self.site.parapet_height)
self.site.wind_speed = form_data.get('wind_speed', self.site.wind_speed)
self.site.exposure_category = form_data.get('exposure_category', self.site.exposure_category)
self.site.exposure_transition_distance = form_data.get('exposure_category_transition_distance',
self.site.exposure_transition_distance)
self.site.ballast_block_weight = form_data.get('ballast_block_weight', self.site.ballast_block_weight)
self.site.max_psf = form_data.get('max_system_pressure', self.site.max_psf)
self.site.system_type = form_data.get('system_type', self.site.system_type)
self.site.module_type = form_data.get('module_type', self.site.module_type)
self.site.anchor_type = form_data.get('anchor_type', self.site.anchor_type)
self.site.spectral_response = form_data.get('design_spectral_response', self.site.spectral_response)
self.site.seismic_importance_factor = form_data.get('importance_factor', self.site.seismic_importance_factor)
if old_system_type != self.site.system_type or old_module_type != self.site.module_type:
self.site.cad_file = None
self.site.cad_file_name = None
self.site.dxf_file = None
self.site.dxf_file_name = None
self.db_session.commit()
def save_or_update_power_station(self, form_data):
power_station = None
if form_data['power_station_id']:
power_station = self.db_session.query(PowerStation).get(int(form_data['power_station_id']))
if not power_station:
power_station = PowerStation(
site_id=self.site.id,
quantity=int(form_data.get('power_station_quantity', 0)),
ac_run_length=int(form_data.get('ac_run_length', 0)),
description=form_data.get('power_station_description', ''),
)
self.db_session.add(power_station)
else:
power_station.quantity = int(form_data.get('power_station_quantity', power_station.quantity))
power_station.ac_run_length = int(form_data.get('ac_run_length', power_station.ac_run_length))
power_station.description = form_data.get('power_station_description', power_station.description)
# Delete all inverters for now in order to create new ones on update
for inverter in power_station.inverters:
self.db_session.delete(inverter)
self.db_session.commit()
inverter_quantity = int(form_data['inverter_quantity'])
if inverter_quantity == 0:
return
for index in range(inverter_quantity):
prefix = 'inverter_' + str(index + 1)
inverter = Inverter(
model=str(form_data[prefix + '-model']),
strings_per_inverter=int(form_data[prefix + '-strings_per_inverter']),
sunshade=bool(form_data.get(prefix + '-sunshade', False)),
dc_switch=bool(form_data.get(prefix + '-dc_switch', False)),
power_station_id=power_station.id,
standalone_inverter_id=None,
)
self.db_session.add(inverter)
self.db_session.commit()
def delete_power_station(self, power_station_id):
power_station = self.db_session.query(PowerStation).get(power_station_id)
if power_station:
attached_standalone_inverters = self.db_session.query(StandaloneInverter).filter(StandaloneInverter.attachment_point_id==power_station.id).all()
for standalone_inverter in attached_standalone_inverters:
standalone_inverter.attachment_point_id = None
attached_power_monitors = self.db_session.query(PowerMonitor).filter(PowerMonitor.power_station_id==power_station.id).all()
for power_monitor in attached_power_monitors:
power_monitor.power_station_id = None
self.db_session.delete(power_station)
self.db_session.commit()
def delete_power_station_config_data(self):
site_id = self.site.id
power_stations = self.db_session.query(PowerStation).filter(PowerStation.site_id==site_id).all()
for power_station in power_stations:
self.db_session\
.query(StandaloneInverter)\
.filter(StandaloneInverter.attachment_point_id==power_station.id)\
.delete()
self.db_session\
.query(PowerMonitor)\
.filter(PowerMonitor.power_station_id==power_station.id)\
.delete()
self.db_session.delete(power_station)
self.db_session.query(StandaloneInverter).filter(StandaloneInverter.site_id==site_id).delete()
self.db_session.query(PowerMonitor).filter(PowerMonitor.site_id==site_id).delete()
self.db_session.commit()
def save_or_update_inverter_brands(self, form_data):
inverter_brand = None
if form_data.get('inverter_brand_id'):
inverter_brand = self.db_session.query(InverterBrand).filter_by(
site_id=self.site.id
).first()
if not inverter_brand:
inverter_brand = InverterBrand(
id=int(form_data.get('inverter_brand_id')),
site_id=self.site.id,
)
self.db_session.add(inverter_brand)
self.db_session.commit()
else:
inverter_brand.id = int(form_data.get('inverter_brand_id', inverter_brand.id))
self.db_session.commit()
def save_or_update_standalone_inverter(self, form_data):
standalone_inverter = None
prefix = 'inverter-'
if form_data.get('standalone_inverter_id'):
standalone_inverter = self.db_session.query(StandaloneInverter).get(int(form_data.get('standalone_inverter_id')))
if not standalone_inverter:
quantity = int(form_data[prefix + 'quantity'])
for n in range(quantity):
standalone_inverter = StandaloneInverter(
site_id=self.site.id,
attachment_point_id=form_data.get('attachment_point') if form_data.get('attachment_point') != 'switch_gear' else None,
ac_run_length=int(form_data.get('standalone_ac_run_length', 0))
)
self.db_session.add(standalone_inverter)
self.db_session.commit()
inverter = Inverter(
model=str(form_data[prefix + 'model']),
strings_per_inverter=int(form_data[prefix + 'strings_per_inverter']),
sunshade=bool(form_data.get(prefix + 'sunshade', False)),
dc_switch=bool(form_data.get(prefix + 'dc_switch', False)),
splice_box=bool(form_data.get(prefix + 'splice_box', False)),
power_station_id=None,
standalone_inverter_id=standalone_inverter.id,
)
self.db_session.add(inverter)
self.db_session.commit()
else:
standalone_inverter.ac_run_length = int(form_data.get('standalone_ac_run_length', standalone_inverter.ac_run_length))
standalone_inverter.attachment_point_id = form_data.get('attachment_point') if form_data.get('attachment_point', standalone_inverter.attachment_point_id) != 'switch_gear' else None
standalone_inverter.inverter[0].model = str(form_data[prefix + 'model'])
standalone_inverter.inverter[0].strings_per_inverter = int(form_data[prefix + 'strings_per_inverter'])
standalone_inverter.inverter[0].sunshade = bool(form_data.get(prefix + 'sunshade', False))
standalone_inverter.inverter[0].dc_switch = bool(form_data.get(prefix + 'dc_switch', False))
standalone_inverter.inverter[0].splice_box = bool(form_data.get(prefix + 'splice_box', False))
self.db_session.commit()
def delete_standalone_inverter(self, inverter_id):
standalone_inverter = self.db_session.query(StandaloneInverter).get(inverter_id)
if standalone_inverter:
self.db_session.delete(standalone_inverter)
self.db_session.commit()
def save_or_update_supervisor_monitor(self, form_data):
monitor_id = form_data.get('monitor_id')
if monitor_id:
monitor = self.db_session.query(PowerMonitor).get(monitor_id)
monitor.power_station_id = self.interpret_power_source(form_data.get('power_source'))
else:
monitor = PowerMonitor(
site_id=self.site.id,
power_station_id=self.interpret_power_source(form_data['power_source'])
)
self.db_session.add(monitor)
self.db_session.commit()
def delete_supervisor_monitor(self, monitor_id):
monitor = self.db_session.query(PowerMonitor).get(monitor_id)
if monitor:
self.db_session.delete(monitor)
self.db_session.commit()
def save_uploaded_file(self, contents, cad_file_name=None, dxf_file_name=None):
self.site.cad_file = contents
self.site.cad_file_name = cad_file_name
self.site.dxf_file_name = dxf_file_name
self.store.delete('user_override_seismic_anchors')
self.db_session.commit()
def fill_saved_values_in_form(self, form):
if self.site:
form.project_name.data = self.site.project_name
form.building_height.data = self.site.building_height
form.building_width.data = self.site.building_width
form.building_length.data = self.site.building_length
form.building_parapet_height.data = self.site.parapet_height
form.wind_speed.data = self.site.wind_speed
form.exposure_category.data = self.site.exposure_category
form.exposure_category_transition_distance.data = self.site.exposure_transition_distance
form.ballast_block_weight.data = self.site.ballast_block_weight
form.max_system_pressure.data = self.site.max_psf
form.system_type.data = self.site.system_type
form.module_type.data = self.site.module_type
form.anchor_type.data = self.site.anchor_type
form.design_spectral_response.data = self.site.spectral_response
form.importance_factor.data = str(self.site.seismic_importance_factor)
def save_user_provided_seismic_anchors(self, seismic_anchor_json):
self.store.set("user_override_seismic_anchors", json.dumps(seismic_anchor_json))
def save_buildings_polygons(self, buildings):
# buildings is a
# list of lists of points presented by list of two numbers
# [ [ [123.1, 111.1] , [ 222.1, 223.2 ] , [ 212.1, -225.2 ] ] ]
polygons_primitive = list(map(lambda x: x.points, buildings))
self.store.set("buildings_polygons", json.dumps(polygons_primitive))
def save_is_drawing_inaccurate(self, is_drawing_inaccurate):
self.store.set("is_drawing_inaccurate", json.dumps(is_drawing_inaccurate))
def get_map_index(self, list_id, identifier_key, identifier):
maps = self.store.get_list_of_maps(list_id)
for idx, val in enumerate(maps):
if val[identifier_key] == identifier:
return idx
def interpret_power_source(self, power_source):
if power_source != 'switch_gear':
power_station = self.db_session.query(PowerStation).get(power_source)
if power_station:
return power_station.id
return None