sufia-models 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.md +177 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/app/models/batch.rb +46 -0
- data/app/models/checksum_audit_log.rb +35 -0
- data/app/models/contact_form.rb +42 -0
- data/app/models/datastreams/batch_rdf_datastream.rb +23 -0
- data/app/models/datastreams/file_content_datastream.rb +18 -0
- data/app/models/datastreams/fits_datastream.rb +188 -0
- data/app/models/datastreams/generic_file_rdf_datastream.rb +75 -0
- data/app/models/datastreams/paranoid_rights_datastream.rb +37 -0
- data/app/models/datastreams/properties_datastream.rb +33 -0
- data/app/models/domain_term.rb +18 -0
- data/app/models/follow.rb +28 -0
- data/app/models/generic_file.rb +16 -0
- data/app/models/geo_names_resource.rb +34 -0
- data/app/models/group.rb +8 -0
- data/app/models/local_authority.rb +93 -0
- data/app/models/local_authority_entry.rb +18 -0
- data/app/models/single_use_link.rb +26 -0
- data/app/models/subject_local_authority_entry.rb +16 -0
- data/app/models/trophy.rb +12 -0
- data/app/models/version_committer.rb +17 -0
- data/lib/sufia/models.rb +11 -0
- data/lib/sufia/models/active_fedora/redis.rb +49 -0
- data/lib/sufia/models/active_record/redis.rb +56 -0
- data/lib/sufia/models/engine.rb +34 -0
- data/lib/sufia/models/file_content.rb +9 -0
- data/lib/sufia/models/file_content/extract_metadata.rb +60 -0
- data/lib/sufia/models/file_content/versions.rb +23 -0
- data/lib/sufia/models/generic_file.rb +183 -0
- data/lib/sufia/models/generic_file/actions.rb +39 -0
- data/lib/sufia/models/generic_file/audit.rb +119 -0
- data/lib/sufia/models/generic_file/characterization.rb +81 -0
- data/lib/sufia/models/generic_file/export.rb +339 -0
- data/lib/sufia/models/generic_file/permissions.rb +64 -0
- data/lib/sufia/models/generic_file/thumbnail.rb +91 -0
- data/lib/sufia/models/id_service.rb +57 -0
- data/lib/sufia/models/jobs/audit_job.rb +65 -0
- data/lib/sufia/models/jobs/batch_update_job.rb +86 -0
- data/lib/sufia/models/jobs/characterize_job.rb +43 -0
- data/lib/sufia/models/jobs/content_delete_event_job.rb +31 -0
- data/lib/sufia/models/jobs/content_deposit_event_job.rb +32 -0
- data/lib/sufia/models/jobs/content_new_version_event_job.rb +32 -0
- data/lib/sufia/models/jobs/content_restored_version_event_job.rb +40 -0
- data/lib/sufia/models/jobs/content_update_event_job.rb +32 -0
- data/lib/sufia/models/jobs/event_job.rb +33 -0
- data/lib/sufia/models/jobs/ffmpeg_transcode_job.rb +61 -0
- data/lib/sufia/models/jobs/resolrize_job.rb +23 -0
- data/lib/sufia/models/jobs/transcode_audio_job.rb +40 -0
- data/lib/sufia/models/jobs/transcode_video_job.rb +39 -0
- data/lib/sufia/models/jobs/unzip_job.rb +54 -0
- data/lib/sufia/models/jobs/user_edit_profile_event_job.rb +35 -0
- data/lib/sufia/models/jobs/user_follow_event_job.rb +37 -0
- data/lib/sufia/models/jobs/user_unfollow_event_job.rb +38 -0
- data/lib/sufia/models/model_methods.rb +39 -0
- data/lib/sufia/models/noid.rb +42 -0
- data/lib/sufia/models/solr_document_behavior.rb +125 -0
- data/lib/sufia/models/user.rb +126 -0
- data/lib/sufia/models/utils.rb +36 -0
- data/lib/sufia/models/version.rb +5 -0
- data/lib/tasks/sufia-models_tasks.rake +4 -0
- data/sufia-models.gemspec +28 -0
- metadata +151 -0
@@ -0,0 +1,75 @@
|
|
1
|
+
# Copyright © 2012 The Pennsylvania State University
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
class GenericFileRdfDatastream < ActiveFedora::NtriplesRDFDatastream
|
16
|
+
map_predicates do |map|
|
17
|
+
map.part_of(:to => "isPartOf", :in => RDF::DC)
|
18
|
+
map.contributor(:in => RDF::DC) do |index|
|
19
|
+
index.as :stored_searchable, :facetable
|
20
|
+
end
|
21
|
+
map.creator(:in => RDF::DC) do |index|
|
22
|
+
index.as :stored_searchable, :facetable
|
23
|
+
end
|
24
|
+
map.title(:in => RDF::DC) do |index|
|
25
|
+
index.as :stored_searchable
|
26
|
+
end
|
27
|
+
map.description(:in => RDF::DC) do |index|
|
28
|
+
index.type :text
|
29
|
+
index.as :stored_searchable
|
30
|
+
end
|
31
|
+
map.publisher(:in => RDF::DC) do |index|
|
32
|
+
index.as :stored_searchable, :facetable
|
33
|
+
end
|
34
|
+
map.date_created(:to => "created", :in => RDF::DC) do |index|
|
35
|
+
index.as :stored_searchable
|
36
|
+
end
|
37
|
+
map.date_uploaded(:to => "dateSubmitted", :in => RDF::DC) do |index|
|
38
|
+
index.type :date
|
39
|
+
index.as :stored_sortable
|
40
|
+
end
|
41
|
+
map.date_modified(:to => "modified", :in => RDF::DC) do |index|
|
42
|
+
index.type :date
|
43
|
+
index.as :stored_sortable
|
44
|
+
end
|
45
|
+
map.subject(:in => RDF::DC) do |index|
|
46
|
+
index.as :stored_searchable, :facetable
|
47
|
+
end
|
48
|
+
map.language(:in => RDF::DC) do |index|
|
49
|
+
index.as :stored_searchable, :facetable
|
50
|
+
end
|
51
|
+
map.rights(:in => RDF::DC) do |index|
|
52
|
+
index.as :stored_searchable
|
53
|
+
end
|
54
|
+
map.resource_type(:to => "type", :in => RDF::DC) do |index|
|
55
|
+
index.as :stored_searchable, :facetable
|
56
|
+
end
|
57
|
+
map.identifier(:in => RDF::DC) do |index|
|
58
|
+
index.as :stored_searchable
|
59
|
+
end
|
60
|
+
map.based_near(:in => RDF::FOAF) do |index|
|
61
|
+
index.as :stored_searchable, :facetable
|
62
|
+
end
|
63
|
+
map.tag(:to => "relation", :in => RDF::DC) do |index|
|
64
|
+
index.as :stored_searchable, :facetable
|
65
|
+
end
|
66
|
+
map.related_url(:to => "seeAlso", :in => RDF::RDFS)
|
67
|
+
end
|
68
|
+
begin
|
69
|
+
LocalAuthority.register_vocabulary(self, "subject", "lc_subjects")
|
70
|
+
LocalAuthority.register_vocabulary(self, "language", "lexvo_languages")
|
71
|
+
LocalAuthority.register_vocabulary(self, "tag", "lc_genres")
|
72
|
+
rescue
|
73
|
+
puts "tables for vocabularies missing"
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# Copyright © 2012 The Pennsylvania State University
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'hydra/datastream/rights_metadata'
|
16
|
+
# subclass built-in Hydra RightsDatastream and build in extra model-level validation
|
17
|
+
class ParanoidRightsDatastream < Hydra::Datastream::RightsMetadata
|
18
|
+
use_terminology Hydra::Datastream::RightsMetadata
|
19
|
+
|
20
|
+
VALIDATIONS = [
|
21
|
+
{:key => :edit_users, :message => 'Depositor must have edit access', :condition => lambda { |obj| !obj.edit_users.include?(obj.depositor) }},
|
22
|
+
{:key => :edit_groups, :message => 'Public cannot have edit access', :condition => lambda { |obj| obj.edit_groups.include?('public') }},
|
23
|
+
{:key => :edit_groups, :message => 'Registered cannot have edit access', :condition => lambda { |obj| obj.edit_groups.include?('registered') }}
|
24
|
+
]
|
25
|
+
|
26
|
+
def validate(object)
|
27
|
+
valid = true
|
28
|
+
VALIDATIONS.each do |validation|
|
29
|
+
if validation[:condition].call(object)
|
30
|
+
object.errors[validation[:key]] ||= []
|
31
|
+
object.errors[validation[:key]] << validation[:message]
|
32
|
+
valid = false
|
33
|
+
end
|
34
|
+
end
|
35
|
+
return valid
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Copyright © 2012 The Pennsylvania State University
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
# properties datastream: catch-all for info that didn't have another home. Particularly depositor.
|
16
|
+
class PropertiesDatastream < ActiveFedora::OmDatastream
|
17
|
+
set_terminology do |t|
|
18
|
+
t.root(:path=>"fields" )
|
19
|
+
# This is where we put the user id of the object depositor -- impacts permissions/access controls
|
20
|
+
t.depositor :index_as=>[:stored_searchable]
|
21
|
+
# This is where we put the relative path of the file if submitted as a folder
|
22
|
+
t.relative_path
|
23
|
+
|
24
|
+
t.proxy_depositor path: 'proxyDepositor', :index_as=>:symbol
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.xml_template
|
28
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
29
|
+
xml.fields
|
30
|
+
end
|
31
|
+
builder.doc
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Copyright © 2012 The Pennsylvania State University
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
class DomainTerm < ActiveRecord::Base
|
16
|
+
attr_accessible :model, :term
|
17
|
+
has_and_belongs_to_many :local_authorities, :uniq=> true
|
18
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Copyright © 2012 The Pennsylvania State University
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
class Follow < ActiveRecord::Base
|
16
|
+
|
17
|
+
extend ActsAsFollower::FollowerLib
|
18
|
+
extend ActsAsFollower::FollowScopes
|
19
|
+
|
20
|
+
# NOTE: Follows belong to the "followable" interface, and also to followers
|
21
|
+
belongs_to :followable, :polymorphic => true
|
22
|
+
belongs_to :follower, :polymorphic => true
|
23
|
+
|
24
|
+
def block!
|
25
|
+
self.update_attribute(:blocked, true)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# Copyright © 2012 The Pennsylvania State University
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
class GenericFile < ActiveFedora::Base
|
15
|
+
include Sufia::GenericFile
|
16
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# Copyright © 2012 The Pennsylvania State University
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
class GeoNamesResource < ActiveResource::Base
|
16
|
+
self.site = "http://api.geonames.org/"
|
17
|
+
self.element_name = "searchJSON"
|
18
|
+
self.collection_name = "searchJSON"
|
19
|
+
|
20
|
+
def self.collection_path(prefix_options = {}, query_options = nil)
|
21
|
+
super(prefix_options, query_options).gsub(/\.json|\.xml/, "")
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.instantiate_collection(collection, prefix_options = {})
|
25
|
+
col = super(collection["geonames"],prefix_options)
|
26
|
+
col.map! {|item| { label: item.name+ (item.adminName1 ? ", " + item.adminName1 : "")+", " + item.countryName, value: item.name+ (item.adminName1 ? ", " + item.adminName1 : "")+", " + item.countryName} }
|
27
|
+
return col
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.find_location(location)
|
31
|
+
return GeoNamesResource.find(:all, :params => { :q =>location, :username=>"cam156", :maxRows=>10})
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
data/app/models/group.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
# Copyright © 2012 The Pennsylvania State University
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'rdf'
|
16
|
+
require 'rdf/rdfxml'
|
17
|
+
|
18
|
+
class LocalAuthority < ActiveRecord::Base
|
19
|
+
attr_accessible :name
|
20
|
+
has_and_belongs_to_many :domain_terms, :uniq=> true
|
21
|
+
has_many :local_authority_entries
|
22
|
+
|
23
|
+
def self.harvest_rdf(name, sources, opts = {})
|
24
|
+
return unless self.where(:name => name).empty?
|
25
|
+
authority = self.create(:name => name)
|
26
|
+
format = opts.fetch(:format, :ntriples)
|
27
|
+
predicate = opts.fetch(:predicate, RDF::SKOS.prefLabel)
|
28
|
+
entries = []
|
29
|
+
sources.each do |uri|
|
30
|
+
RDF::Reader.open(uri, :format => format) do |reader|
|
31
|
+
reader.each_statement do |statement|
|
32
|
+
if statement.predicate == predicate
|
33
|
+
entries << LocalAuthorityEntry.new(:local_authority => authority,
|
34
|
+
:label => statement.object.to_s,
|
35
|
+
:uri => statement.subject.to_s)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
LocalAuthorityEntry.import entries
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.harvest_tsv(name, sources, opts = {})
|
44
|
+
return unless self.where(:name => name).empty?
|
45
|
+
authority = self.create(:name => name)
|
46
|
+
prefix = opts.fetch(:prefix, "")
|
47
|
+
entries = []
|
48
|
+
sources.each do |uri|
|
49
|
+
open(uri) do |f|
|
50
|
+
f.each_line do |tsv|
|
51
|
+
fields = tsv.split(/\t/)
|
52
|
+
entries << LocalAuthorityEntry.new(:local_authority => authority,
|
53
|
+
:uri => "#{prefix}#{fields[0]}/",
|
54
|
+
:label => fields[2])
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
LocalAuthorityEntry.import entries
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.register_vocabulary(model, term, name)
|
62
|
+
authority = self.find_by_name(name)
|
63
|
+
return if authority.blank?
|
64
|
+
model = model.to_s.sub(/RdfDatastream$/, '').underscore.pluralize
|
65
|
+
domain_term = DomainTerm.find_or_create_by_model_and_term(:model => model, :term => term)
|
66
|
+
return if domain_term.local_authorities.include? authority
|
67
|
+
domain_term.local_authorities << authority
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.entries_by_term(model, term, query)
|
71
|
+
return if query.empty?
|
72
|
+
lowQuery = query.downcase
|
73
|
+
hits = []
|
74
|
+
# move lc_subject into it's own table since being part of the usual structure caused it to be too slow.
|
75
|
+
# When/if we move to having multiple dictionaries for subject we will need to also do a check for the appropriate dictionary.
|
76
|
+
if (term == 'subject' && model == 'generic_files') # and local_authoritiy = lc_subject
|
77
|
+
sql = SubjectLocalAuthorityEntry.where("lowerLabel like ?", "#{lowQuery}%").select("label, uri").limit(25).to_sql
|
78
|
+
SubjectLocalAuthorityEntry.find_by_sql(sql).each do |hit|
|
79
|
+
hits << {:uri => hit.uri, :label => hit.label}
|
80
|
+
end
|
81
|
+
else
|
82
|
+
dterm = DomainTerm.where(:model => model, :term => term).first
|
83
|
+
if dterm
|
84
|
+
authorities = dterm.local_authorities.collect(&:id).uniq
|
85
|
+
sql = LocalAuthorityEntry.where("local_authority_id in (?)", authorities).where("lower(label) like ?", "#{lowQuery}%").select("label, uri").limit(25).to_sql
|
86
|
+
LocalAuthorityEntry.find_by_sql(sql).each do |hit|
|
87
|
+
hits << {:uri => hit.uri, :label => hit.label}
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
return hits
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Copyright © 2012 The Pennsylvania State University
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
class LocalAuthorityEntry < ActiveRecord::Base
|
16
|
+
belongs_to :local_authority
|
17
|
+
attr_accessible :local_authority, :label, :uri
|
18
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class SingleUseLink < ActiveRecord::Base
|
2
|
+
|
3
|
+
attr_accessible :downloadKey, :expires, :itemId, :path
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
def self.create_show(item_id)
|
8
|
+
create_path(item_id, Sufia::Engine.routes.url_helpers.generic_file_path(item_id) )
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.create_download(item_id)
|
12
|
+
create_path(item_id, Sufia::Engine.routes.url_helpers.download_path(item_id) )
|
13
|
+
end
|
14
|
+
|
15
|
+
def expired?
|
16
|
+
now = DateTime.now
|
17
|
+
return (now > expires)
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
def self.create_path(itemId, path)
|
22
|
+
expires = DateTime.now.advance(hours:24)
|
23
|
+
key = Digest::SHA2.new << DateTime.now.to_f.to_s
|
24
|
+
return create({downloadKey:key.to_s, expires:expires, path:path, itemId:itemId} )
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# Copyright © 2012 The Pennsylvania State University
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
class SubjectLocalAuthorityEntry < ActiveRecord::Base
|
16
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class Trophy < ActiveRecord::Base
|
2
|
+
attr_accessible :generic_file_id, :user_id
|
3
|
+
|
4
|
+
validate :count_within_limit, :on => :create
|
5
|
+
|
6
|
+
def count_within_limit
|
7
|
+
if Trophy.where(user_id:self.user_id).count >= 5
|
8
|
+
errors.add(:base, "Exceeded trophy limit")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Copyright © 2012 The Pennsylvania State University
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
class VersionCommitter < ActiveRecord::Base
|
16
|
+
attr_accessible :obj_id, :datastream_id, :version_id, :committer_login
|
17
|
+
end
|