Class: Document
- Includes:
- Versions::Attachment
- Defined in:
- app/models/document.rb
Overview
should be a sub-class of Node, not Page (#184). Write a migration, fix fixtures and test.
Direct Known Subclasses
Constant Summary
Constants inherited from Node
Node::Caster, Node::VERSION_ATTRIBUTES
Constants included from Zena::Use::Workflow
Zena::Use::Workflow::WORKFLOW_ATTRIBUTES
Class Method Summary collapse
-
.accept_content_type_change? ⇒ Boolean
Return true if the content_type can change independantly from the file.
-
.change_to_classes_for_form ⇒ Object
Class list to which this class can change to.
-
.document_class_from_content_type(content_type) ⇒ Object
Return document class and content_type from content_type.
-
.new(attrs = {}, vclass = nil) ⇒ Object
(also: new_instance)
Return a new Document or a sub-class of Document depending on the file’s content type.
- .o_new ⇒ Object
- .version_class ⇒ Object
Instance Method Summary collapse
-
#file=(new_file) ⇒ Object
Create an attachment with a file in file system.
-
#filename ⇒ Object
Get the document’s public filename using the name and the file extension.
-
#filepath(format = nil) ⇒ Object
Get the file path defined in attachment.
-
#image? ⇒ Boolean
Return true if the document is an image.
-
#size(mode = nil) ⇒ Object
Return the file size.
Methods inherited from Node
#all_relations, allowed_change_to_classes, #archive, #asset_path, #auth, #auth=, #auth_user, #auth_users, #author, author_proc, auto_create_discussion, #can_auto_create_discussion?, #can_comment?, cast_to_class, class_for_relation, classes_for_form, #comments, #comments_count, #content_lang, create_node, create_nodes_from_folder, create_or_update_node, #data, #discussion, #dyn_attribute_keys, #empty?, #export_keys, #export_to_folder, extract_archive, find_by_parent_title_and_kpath, find_by_title, find_by_zip, find_node_by_pseudo, #find_node_by_pseudo, get_attributes_from_yaml, get_class, #get_discussion_id, #get_project_id, get_role, #get_section_id, inherited, inspect, #klass, #klass=, #klass_changed?, kpath_match?, #kpath_match?, kpaths_for_form, load_unhandled_children, #login_info, #m_author, #m_author=, #m_text, #m_text=, #m_title, #m_title=, make_schema, #merge_multi_errors, native_classes, native_classes_by_name, #new_child, new_node, #o_skin, #o_user, #parent, #parent_zip, #parent_zip=, #parse_assets, #parse_keys, plural_relation?, #project, #project_zip, #rcast, #real_project, #real_section, #reload, #replace_attributes_in_values, #safe_method_type, #safe_send, #section, #section_zip, #skin, #skin_zip, #skin_zip=, #sweep_cache, #to_yaml, transform_attributes, translate_pseudo_id, #unparse_assets, #update_attributes_with_transformation, #user, #user_zip, #v_number, #vclass, #versions_with_secure, #virtual_class, #virtual_class=, #vkind_of?, zafu_attribute, #zafu_eval, #zafu_versions
Methods included from Zena::Use::Search::NodeClassMethods
#match_query, #search_index, #search_records, #search_text
Methods included from Zena::Acts::Secure
#secure_scope, #secure_write_scope, #visitor=
Methods included from Zena::Acts::Secure::SecureResult
#construct_id_map, #secure_result
Methods included from Zena::Acts::SecureNode
Methods included from Zena::Use::Dates::ModelMethods
Methods included from Zena::Use::Dates::Common
Methods included from Zena::Use::QueryNode::ModelMethods
#db_attr, #find, included, #safe_first, #start_node_zip
Methods included from Zena::Use::ScopeIndex::ModelMethods
included, #rebuild_index_with_scope_index!, #rebuild_scope_index!, #scope_index, scope_index_proc
Methods included from Zena::Use::Relations::ModelMethods
#add_link, #all_relations, included, #l_comment, #l_comment=, #l_date, #l_date=, #l_status, #l_status=, #link_id, #link_id=, #linked_node, #linked_node=, #rel, #rel=, #rel_attributes=, #relation_alias, #relation_links, #relation_proxy, #relation_proxy_from_link, #relations_for_form, #remove_link
Methods included from Zena::Use::Fulltext::ModelMethods
included, #rebuild_index_for_version_with_fulltext
Methods included from Zena::Use::PropEval::ModelMethods
included, #merge_prop_eval, #need_set__id, #rebuild_index_for_version_with_prop_eval, #set__id
Methods included from Zena::Use::VersionHash::ModelMethods
#rebuild_vhash, #v_public?, #version, #version_id, #vhash, #visible_versions
Methods included from Zena::Acts::Serializable::ModelMethods
#all_link_ids, #default_serialization_options, #export_ids, #export_properties, included, #to_xml
Methods included from Zena::Use::Ancestry::ModelMethods
#ancestors, #basepath, #fullpath_as_title, included, #is_ancestor?, #pseudo_id, #short_path, #z_ancestors
Methods included from Zena::Use::Workflow
#after_all, #apply, #apply_with_callbacks, #auto_publish?, #can_apply?, #can_destroy_version?, #can_edit?, #can_propose?, #can_publish?, #can_refuse?, #can_remove?, #can_unpublish?, #can_update?, #destroy_version, #edit_content!, #get_publish_from, included, #propose, #publish, #redit, #refuse, #remove, #save_without_clone, #set_current_transition, #traductions, #transition_allowed?, #transition_for, #unpublish, #update_attributes, #update_attributes_without_clone, #would_change_original?
Methods included from Zena::Use::NestedAttributesAlias::ModelMethods
#attributes_with_nested_alias=, included, #nested_model_names_for_alias, #resolve_attributes_alias
Methods included from Zena::Acts::Enrollable::ModelMethods
#assigned_roles, #has_role?, included, #zafu_possible_roles
Methods included from Zena::Use::FieldIndex::ModelMethods
included, #property_field_index
Methods included from Zena::Use::MLIndex::ModelMethods
included, #index_reader, #rebuild_index_for_version, #rebuild_index_with_multi_lingual!
Methods included from Zena::Use::Kpath::InstanceMethods
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class Zena::Use::Relations::ModelMethods
Class Method Details
.accept_content_type_change? ⇒ Boolean
Return true if the content_type can change independantly from the file
138 139 140 |
# File 'app/models/document.rb', line 138 def accept_content_type_change? false end |
.change_to_classes_for_form ⇒ Object
Class list to which this class can change to
101 102 103 |
# File 'app/models/document.rb', line 101 def change_to_classes_for_form classes_for_form(:class => 'Document', :without => 'Image') end |
.document_class_from_content_type(content_type) ⇒ Object
Return document class and content_type from content_type
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'app/models/document.rb', line 106 def document_class_from_content_type(content_type) base = if content_type if Image.accept_content_type?(content_type) Image elsif Template.accept_content_type?(content_type) Template elsif TextDocument.accept_content_type?(content_type) TextDocument else self end elsif self == Document # no content_type means no file. Only TextDocuments can be created without files TextDocument else self end # Try to find a virtual sub-class accepting the content type vclass = nil VirtualClass[base.to_s].sub_classes.each do |v| next if v.real_class != base if content_type =~ v.content_type_re vclass = v break end end vclass || VirtualClass[base.to_s] end |
.new(attrs = {}, vclass = nil) ⇒ Object Also known as: new_instance
Return a new Document or a sub-class of Document depending on the file’s content type. Returns a TextDocument if there is no file.
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'app/models/document.rb', line 63 def new(attrs = {}, vclass = nil) attrs = attrs.stringify_keys file = attrs['file'] || ((attrs['version_attributes'] || {})['content_attributes'] || {})['file'] if ct = attrs['content_type'] content_type = ct elsif file && file.respond_to?(:content_type) && file.content_type != 'application/octet-stream' content_type = file.content_type elsif attrs['title'] =~ /^.*\.(\w+)$/ && types = Zena::EXT_TO_TYPE[$1.downcase] content_type = types[0] elsif file content_type = 'application/octet-stream' elsif attrs['target_klass'] || self <= Template content_type = 'text/zafu' else content_type = 'text/plain' end klass = document_class_from_content_type(content_type) real_class = klass.real_class if vclass && vclass.kpath =~ /\A#{real_class.kpath}/ && vclass.content_type_re =~ content_type klass = vclass end attrs['content_type'] = content_type if real_class != self secure(real_class) { real_class.o_new(attrs, klass) } else super(attrs, klass) end end |
.o_new ⇒ Object
60 |
# File 'app/models/document.rb', line 60 alias o_new new |
.version_class ⇒ Object
56 57 58 |
# File 'app/models/document.rb', line 56 def version_class DocumentVersion end |
Instance Method Details
#file=(new_file) ⇒ Object
Create an attachment with a file in file system. Create a new version if file is updated.
144 145 146 147 148 149 |
# File 'app/models/document.rb', line 144 def file=(new_file) if new_file = super(new_file) self.size = new_file.kind_of?(StringIO) ? new_file.size : new_file.stat.size @new_file = new_file end end |
#filename ⇒ Object
Get the document’s public filename using the name and the file extension.
168 169 170 |
# File 'app/models/document.rb', line 168 def filename "#{title}.#{ext}" end |
#filepath(format = nil) ⇒ Object
Get the file path defined in attachment.
173 174 175 |
# File 'app/models/document.rb', line 173 def filepath(format=nil) version..filepath(format) end |
#image? ⇒ Boolean
Return true if the document is an image.
163 164 165 |
# File 'app/models/document.rb', line 163 def image? kind_of?(Image) end |
#size(mode = nil) ⇒ Object
Return the file size.
152 153 154 155 156 157 158 159 160 |
# File 'app/models/document.rb', line 152 def size(mode=nil) if prop['size'] prop['size'] elsif !new_record? && File.exist?(self.filepath) prop['size'] = File.size(self.filepath) self.save prop['size'] end end |