forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
PlaceOS::Model::SignageTemplate
Inherits Neuroplastic < PgORM::Timestamps < PgORM::Base < PgORM::Validators < PgORM::Table < PgORM::Persistence < PgORM::Associations < ActiveModel::Callbacks < ActiveModel::Validation < ActiveModel::Model < DB::Mappable < DB::Serializable < YAML::Serializable < JSON::Serializable < Reference < Object
positions widget plugins over a signage display, changing its layout.
Attached to displays via SignageTemplate::SystemTemplate.
Constants
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
macro level key => type
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Constructors
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Deserializes the given JSON in string_or_io into
an instance of self, assuming the JSON consists
of an JSON object with key root, and whose value is
the value to deserialize. Will not deserialise from
fields with mass_assign: false
class User < ActiveModel::Model
attribute name : String
attribute google_id : UUID, mass_assign: false
end
User.from_json(%({"main": {"name": "Jason", "google_id": "f6f70bfb-c882-446d-8758-7ce47db39620"}}), root: "main") # => #<User:0x103131b20 @name="Jason">
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Serialize from a trusted JSON source
Serialize from a trusted YAML source
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Initialize PlaceOS::Model::SignageTemplate from HTTP::Params.
Class methods
Returns all attribute keys.
Changefeed at row (if id passed) or whole table level.
Returns a ChangeFeed instance which can be used to invoke async callbacks via on or
use blocking Iterator via each method.
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Instance methods
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Generate code to apply default values
approval_requested getter
approval_requested setter
NOTE: use getter / getter! (not property / property!) so that the
setter defined later in __create_initializer__ is the only setter on
the field. Crystal's overload resolution silently fails to replace a
property-defined setter with one of identical signature for generic
types (e.g. Set(String)?, Array(String)?, String | Array(String)),
although it does work for non-generic ones like String?. Defining the
setter only once via __create_initializer__ ensures change tracking,
sanitization, and custom setter blocks run uniformly across all types.
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include approval_requested in the set of changed attributes, whether it has changed or not.
promotes this draft onto the approved template it references: copies the display fields, records the approver on the live template and removes the draft โ all in a single transaction
approved getter
approved setter
NOTE: use getter / getter! (not property / property!) so that the
setter defined later in __create_initializer__ is the only setter on
the field. Crystal's overload resolution silently fails to replace a
property-defined setter with one of identical signature for generic
types (e.g. Set(String)?, Array(String)?, String | Array(String)),
although it does work for non-generic ones like String?. Defining the
setter only once via __create_initializer__ ensures change tracking,
sanitization, and custom setter blocks run uniformly across all types.
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
approved_by_email getter
approved_by_email setter
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include approved_by_email in the set of changed attributes, whether it has changed or not.
approved_by_id getter
approved_by_id setter
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include approved_by_id in the set of changed attributes, whether it has changed or not.
approved_by_name getter
approved_by_name setter
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include approved_by_name in the set of changed attributes, whether it has changed or not.
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include approved in the set of changed attributes, whether it has changed or not.
Assign to multiple attributes.
Assign to multiple attributes via HTTP::Params.
Assign to multiple attributes from a model object
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Assign each field from JSON if field exists in JSON and has changed in model
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Uses the YAML parser as JSON is valid YAML
Returns a Hash of all attribute values
Returns a NamedTuple of all attribute values.
authority_id getter
authority_id setter
NOTE: use getter / getter! (not property / property!) so that the
setter defined later in __create_initializer__ is the only setter on
the field. Crystal's overload resolution silently fails to replace a
property-defined setter with one of identical signature for generic
types (e.g. Set(String)?, Array(String)?, String | Array(String)),
although it does work for non-generic ones like String?. Defining the
setter only once via __create_initializer__ ensures change tracking,
sanitization, and custom setter blocks run uniformly across all types.
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include authority_id in the set of changed attributes, whether it has changed or not.
background_item_id getter
background_item_id setter
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
optional media item rendered behind the widgets (cleared at the DB level if the item is deleted: ON DELETE SET NULL)
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include background_item_id in the set of changed attributes, whether it has changed or not.
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Check if any attributes have changed.
Returns a Hash with all changed attributes.
Serialize the set of changed attributes to JSON.
Serialize the set of changed attributes to JSON.
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Serialize the set of changed attributes to YAML.
Serialize the set of changed attributes to YAML.
Reset changes for all attributes.
created_at getter
Setters
created_at setter
NOTE: use getter / getter! (not property / property!) so that the
setter defined later in __create_initializer__ is the only setter on
the field. Crystal's overload resolution silently fails to replace a
property-defined setter with one of identical signature for generic
types (e.g. Set(String)?, Array(String)?, String | Array(String)),
although it does work for non-generic ones like String?. Defining the
setter only once via __create_initializer__ ensures change tracking,
sanitization, and custom setter blocks run uniformly across all types.
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
created_at's default value
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include created_at in the set of changed attributes, whether it has changed or not.
description getter
description setter
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include description in the set of changed attributes, whether it has changed or not.
full_screen_takeover getter
full_screen_takeover setter
NOTE: use getter / getter! (not property / property!) so that the
setter defined later in __create_initializer__ is the only setter on
the field. Crystal's overload resolution silently fails to replace a
property-defined setter with one of identical signature for generic
types (e.g. Set(String)?, Array(String)?, String | Array(String)),
although it does work for non-generic ones like String?. Defining the
setter only once via __create_initializer__ ensures change tracking,
sanitization, and custom setter blocks run uniformly across all types.
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include full_screen_takeover in the set of changed attributes, whether it has changed or not.
id getter
id setter
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
id's default value
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include id in the set of changed attributes, whether it has changed or not.
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
layouts getter
layouts setter
NOTE: use getter / getter! (not property / property!) so that the
setter defined later in __create_initializer__ is the only setter on
the field. Crystal's overload resolution silently fails to replace a
property-defined setter with one of identical signature for generic
types (e.g. Set(String)?, Array(String)?, String | Array(String)),
although it does work for non-generic ones like String?. Defining the
setter only once via __create_initializer__ ensures change tracking,
sanitization, and custom setter blocks run uniformly across all types.
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
widget placements, stored as a JSONB array. Not indexed in elastic.
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include layouts in the set of changed attributes, whether it has changed or not.
live_template_id getter
live_template_id setter
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
approved templates should not be edited in place, so drafts are separate rows referencing the approved parent they were copied from. Drafts are removed at the DB level when the parent is deleted (ON DELETE CASCADE)
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include live_template_id in the set of changed attributes, whether it has changed or not.
name getter
name setter
NOTE: use getter / getter! (not property / property!) so that the
setter defined later in __create_initializer__ is the only setter on
the field. Crystal's overload resolution silently fails to replace a
property-defined setter with one of identical signature for generic
types (e.g. Set(String)?, Array(String)?, String | Array(String)),
although it does work for non-generic ones like String?. Defining the
setter only once via __create_initializer__ ensures change tracking,
sanitization, and custom setter blocks run uniformly across all types.
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include name in the set of changed attributes, whether it has changed or not.
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
requested_by_id getter
requested_by_id setter
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include requested_by_id in the set of changed attributes, whether it has changed or not.
Reset each attribute to their previous values and clears all changes.
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
tags getter
tags setter
NOTE: use getter / getter! (not property / property!) so that the
setter defined later in __create_initializer__ is the only setter on
the field. Crystal's overload resolution silently fails to replace a
property-defined setter with one of identical signature for generic
types (e.g. Set(String)?, Array(String)?, String | Array(String)),
although it does work for non-generic ones like String?. Defining the
setter only once via __create_initializer__ ensures change tracking,
sanitization, and custom setter blocks run uniformly across all types.
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include tags in the set of changed attributes, whether it has changed or not.
updated_at getter
updated_at setter
NOTE: use getter / getter! (not property / property!) so that the
setter defined later in __create_initializer__ is the only setter on
the field. Crystal's overload resolution silently fails to replace a
property-defined setter with one of identical signature for generic
types (e.g. Set(String)?, Array(String)?, String | Array(String)),
although it does work for non-generic ones like String?. Defining the
setter only once via __create_initializer__ ensures change tracking,
sanitization, and custom setter blocks run uniformly across all types.
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Returns a Tuple of the previous and the current value of an instance variable if it has changed
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
updated_at's default value
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
forward declare so this file can be required before signage_template.cr
finishes defining the parent class (the attribute layouts : Array(Layout)
line needs Layout resolved at macro-expansion time).
Include updated_at in the set of changed attributes, whether it has changed or not.
Validate that all non-nillable fields have values.