Update tempmon UI now that enabled flags are really datetime in DB
				
					
				
			This commit is contained in:
		
							parent
							
								
									90e1baef50
								
							
						
					
					
						commit
						eb78d79bb3
					
				
					 4 changed files with 75 additions and 22 deletions
				
			
		|  | @ -2,7 +2,7 @@ | |||
| ################################################################################ | ||||
| # | ||||
| #  Rattail -- Retail Software Framework | ||||
| #  Copyright © 2010-2018 Lance Edgar | ||||
| #  Copyright © 2010-2019 Lance Edgar | ||||
| # | ||||
| #  This file is part of Rattail. | ||||
| # | ||||
|  | @ -27,6 +27,7 @@ Form Schema Types | |||
| from __future__ import unicode_literals, absolute_import | ||||
| 
 | ||||
| import re | ||||
| import datetime | ||||
| 
 | ||||
| import six | ||||
| 
 | ||||
|  | @ -63,6 +64,18 @@ class JQueryTime(colander.Time): | |||
|         return colander.timeparse(cstruct, formats[0]) | ||||
| 
 | ||||
| 
 | ||||
| class DateTimeBoolean(colander.Boolean): | ||||
|     """ | ||||
|     Schema type which presents the user with a "boolean" whereas the underlying | ||||
|     node is really a datetime (assumed to be "naive" UTC, and allow nulls). | ||||
|     """ | ||||
| 
 | ||||
|     def deserialize(self, node, cstruct): | ||||
|         value = super(DateTimeBoolean, self).deserialize(node, cstruct) | ||||
|         if value: # else return None | ||||
|             return datetime.datetime.utcnow() | ||||
| 
 | ||||
| 
 | ||||
| class GPCType(colander.SchemaType): | ||||
|     """ | ||||
|     Schema type for product GPC data. | ||||
|  |  | |||
|  | @ -5,31 +5,36 @@ | |||
| ## page body | ||||
| ############################## | ||||
| 
 | ||||
| <ul id="context-menu"> | ||||
|   ${self.context_menu_items()} | ||||
| </ul> | ||||
| <div style="display: flex; justify-content: space-between;"> | ||||
| 
 | ||||
| <div class="form-wrapper"> | ||||
|   <div class="form-wrapper"> | ||||
| 
 | ||||
|   <div class="panel" id="probe-main"> | ||||
|     <h2>General</h2> | ||||
|     <div class="panel-body"> | ||||
|       <div style="clear: none; float: left;"> | ||||
|         ${self.render_main_fields(form)} | ||||
|     <div style="display: flex; flex-direction: column;"> | ||||
| 
 | ||||
|       <div class="panel" id="probe-main"> | ||||
|         <h2>General</h2> | ||||
|         <div class="panel-body"> | ||||
|           <div> | ||||
|             ${self.render_main_fields(form)} | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
| ##       % if image_url: | ||||
| ##           ${h.image(image_url, "Probe Image", id='probe-image', width=150, height=150)} | ||||
| ##       % endif | ||||
| 
 | ||||
|       <div style="display: flex;"> | ||||
|         <div class="panel-wrapper"> | ||||
|           ${self.left_column()} | ||||
|         </div> | ||||
|         <div class="panel-wrapper" style="margin-left: 1em;"> <!-- right column --> | ||||
|           ${self.right_column()} | ||||
|         </div> | ||||
|       </div> | ||||
| 
 | ||||
|     </div> | ||||
|   </div> | ||||
| 
 | ||||
|   <div class="panel-wrapper"> | ||||
|     ${self.left_column()} | ||||
|   </div> | ||||
| 
 | ||||
|   <div class="panel-wrapper"> | ||||
|     ${self.right_column()} | ||||
|   </div> | ||||
|   <ul id="context-menu"> | ||||
|     ${self.context_menu_items()} | ||||
|   </ul> | ||||
| 
 | ||||
| </div> | ||||
| 
 | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| ################################################################################ | ||||
| # | ||||
| #  Rattail -- Retail Software Framework | ||||
| #  Copyright © 2010-2018 Lance Edgar | ||||
| #  Copyright © 2010-2019 Lance Edgar | ||||
| # | ||||
| #  This file is part of Rattail. | ||||
| # | ||||
|  | @ -34,6 +34,7 @@ from rattail_tempmon.db import model as tempmon | |||
| import colander | ||||
| from webhelpers2.html import HTML, tags | ||||
| 
 | ||||
| from tailbone import forms | ||||
| from tailbone.views.tempmon import MasterView | ||||
| 
 | ||||
| 
 | ||||
|  | @ -101,6 +102,9 @@ class TempmonClientView(MasterView): | |||
|         # disk_type | ||||
|         g.set_enum('disk_type', self.enum.TEMPMON_DISK_TYPE) | ||||
| 
 | ||||
|         # enabled | ||||
|         g.set_type('enabled', 'boolean') | ||||
| 
 | ||||
|         # archived | ||||
|         g.filters['archived'].default_active = True | ||||
|         g.filters['archived'].default_verb = 'is_false' | ||||
|  | @ -134,6 +138,8 @@ class TempmonClientView(MasterView): | |||
|         f.set_type('notes', 'text') | ||||
| 
 | ||||
|         # enabled | ||||
|         if self.creating or self.editing: | ||||
|             f.set_node('enabled', forms.types.DateTimeBoolean()) | ||||
|         f.set_helptext('enabled', tempmon.Client.enabled.__doc__) | ||||
| 
 | ||||
|         # online | ||||
|  | @ -145,6 +151,18 @@ class TempmonClientView(MasterView): | |||
|         # archived | ||||
|         f.set_helptext('archived', tempmon.Client.archived.__doc__) | ||||
| 
 | ||||
|     def objectify(self, form, data=None): | ||||
| 
 | ||||
|         # this is a hack to prevent updates to the 'enabled' timestamp, when | ||||
|         # simple edits are being done to the client.  i.e. we do want to set | ||||
|         # the timestamp when it was previously null, but not otherwise. | ||||
|         if self.editing: | ||||
|             data = dict(data or form.validated) | ||||
|             if data['enabled'] and form.model_instance.enabled: | ||||
|                 data['enabled'] = form.model_instance.enabled | ||||
| 
 | ||||
|         return super(TempmonClientView, self).objectify(form, data=data) | ||||
| 
 | ||||
|     def unique_config_key(self, node, value): | ||||
|         query = self.Session.query(tempmon.Client)\ | ||||
|                             .filter(tempmon.Client.config_key == value) | ||||
|  |  | |||
|  | @ -37,7 +37,7 @@ import colander | |||
| from deform import widget as dfwidget | ||||
| from webhelpers2.html import tags | ||||
| 
 | ||||
| from tailbone import grids | ||||
| from tailbone import forms, grids | ||||
| from tailbone.views.tempmon import MasterView | ||||
| 
 | ||||
| 
 | ||||
|  | @ -168,6 +168,23 @@ class TempmonProbeView(MasterView): | |||
|         if self.creating or self.editing: | ||||
|             f.remove_fields('status') | ||||
| 
 | ||||
|         # enabled | ||||
|         if self.creating or self.editing: | ||||
|             f.set_node('enabled', forms.types.DateTimeBoolean()) | ||||
|         f.set_helptext('enabled', tempmon.Probe.enabled.__doc__) | ||||
| 
 | ||||
|     def objectify(self, form, data=None): | ||||
| 
 | ||||
|         # this is a hack to prevent updates to the 'enabled' timestamp, when | ||||
|         # simple edits are being done to the probe.  i.e. we do want to set the | ||||
|         # timestamp when it was previously null, but not otherwise. | ||||
|         if self.editing: | ||||
|             data = dict(data or form.validated) | ||||
|             if data['enabled'] and form.model_instance.enabled: | ||||
|                 data['enabled'] = form.model_instance.enabled | ||||
| 
 | ||||
|         return super(TempmonProbeView, self).objectify(form, data=data) | ||||
| 
 | ||||
|     def unique_config_key(self, node, value): | ||||
|         query = self.Session.query(tempmon.Probe)\ | ||||
|                             .filter(tempmon.Probe.config_key == value) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Lance Edgar
						Lance Edgar