wordjelly-auth 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a718a6cf6f3777261fd7e238201e3136394bd580
4
- data.tar.gz: 85aa506e330312e5b1bfe0ed8d2e5e501e97685e
3
+ metadata.gz: 19a46d7a74a79c55717dd9c3eb1e9a9bfa2f59b0
4
+ data.tar.gz: 43690d96180781c8c12bfb818bf5c7a61e8fb59e
5
5
  SHA512:
6
- metadata.gz: 59aca114451a99d6ea926a7fa4765fc73c2b7208471845d3fb4e57dbf8bb8848d57a7c85ee3f00931304dc668913081df3be92d21c19358d9def6aa398142613
7
- data.tar.gz: 583172d9e331b87c85addebb0cc2f943ad776494776423c2c3f320cad3d70ef112307adbd34664767c806eb537d71b57913a698dff833595fc52b45e588441ec
6
+ metadata.gz: bf2eb9ea412904b566efaad965adfcb8fe32409ea337187b6ec5985d57c99e9a93d6f8be165f128bc0a6e034b3ae2b948929acc08dcbe0ed154b9fedbb65d061
7
+ data.tar.gz: 3f428c140567a30d25e20722caed25b7e09b18b24d2f875cebef0acf204705a8b782093b483b6c0a9f4781df46f4e6b19f92ed5895cf312cdcd37c462e2366d5
@@ -24,6 +24,11 @@ module Auth
24
24
  respond_with @client
25
25
  end
26
26
 
27
+ ## how are we going to get the client id exactly?
28
+ ## that's the basic problem
29
+ ## thereafter we can do the rest.
30
+
31
+
27
32
  # GET /clients/new
28
33
  def new
29
34
  #@client = Client.new
@@ -86,6 +91,9 @@ module Auth
86
91
 
87
92
  ## if the resource_signed_in is an admin, just return
88
93
  ## otherwise if the user's id is not the same as the id passed in, then throw a not_found.
94
+ ## this means that only if the guy is an admin , then this can work.
95
+ ## otherwise it cannot work
96
+ ## i think this has to be done from the web app.
89
97
  def verify_client_belongs_to_user
90
98
  return if @resource_for_web_app.is_admin?
91
99
  not_found("client does not belong to user") if @resource_for_web_app.id.to_s != params[:id]
@@ -11,12 +11,13 @@ class Auth::ProfilesController < Auth::ApplicationController
11
11
  before_action :initialize_vars, TCONDITIONS
12
12
  before_action :is_admin_user, :only => [:set_proxy_user]
13
13
 
14
-
15
14
  def initialize_vars
15
+ puts "---------------------------------------------------"
16
16
  @resource_params = {}
17
17
  @profile_resource = nil
18
18
  @all_params = permitted_params.deep_symbolize_keys
19
19
 
20
+
20
21
  if collection = @all_params[:resource]
21
22
 
22
23
  if Auth.configuration.auth_resources[collection.singularize.capitalize]
@@ -1,4 +1,6 @@
1
1
  module Auth
2
2
  module ClientsHelper
3
+
4
+
3
5
  end
4
6
  end
@@ -117,6 +117,23 @@ module Auth::Concerns::Shopping::ProductConcern
117
117
 
118
118
  module ClassMethods
119
119
 
120
+ ## so we have completed the rolling n minutes.
121
+ def add_to_previous_rolling_n_minutes(minutes,origin_epoch,cycle_to_add)
122
+
123
+ ## get all the minutes less than that.
124
+ rolling_n_minutes_less_than_that = minutes.keys.select{|c| c < origin_epoch}
125
+
126
+ end_min = rolling_n_minutes_less_than_that.size < Auth.configuration.rolling_minutes ? rolling_n_minutes_less_than_that.size : Auth.configuration.rolling_minutes
127
+
128
+ end_min = end_min - 1
129
+
130
+ end_min = end_min > 0 ? end_min : 0
131
+ rolling_n_minutes_less_than_that[0..end_min].each do |epoch|
132
+ minutes[epoch].cycles << cycle_to_add
133
+ end
134
+
135
+ end
136
+
120
137
  ## minutes : {epoch => minute object}
121
138
  def schedule_cycles(minutes,location_id,conditions = {})
122
139
 
@@ -124,44 +141,42 @@ module Auth::Concerns::Shopping::ProductConcern
124
141
 
125
142
  products = Auth.configuration.product_class.constantize.where(conditions) if !conditions.blank?
126
143
 
127
-
128
- minutes.keys.each do |minute|
129
- #puts "doing minute: #{minute}"
144
+ minutes.keys.each do |epoch|
145
+
130
146
  products.each do |product|
131
- #puts "doing product: #{product}"
147
+
132
148
  all_cycles_valid = true
133
149
  product.cycles.each do |cycle|
134
- #puts "doing cycle : #{cycle}"
135
- all_cycles_valid = cycle.requirements_satisfied(minute + cycle.time_since_prev_cycle.minutes*60,location_id)
136
- #puts "all cycles valid becomes ------------------------------------------------------------- #{all_cycles_valid.to_s}"
150
+
151
+ all_cycles_valid = cycle.requirements_satisfied(epoch + cycle.time_since_prev_cycle.minutes*60,location_id)
152
+
137
153
  end
154
+
155
+ ## just because the cycles are valid, it means we have workers, but how many?
156
+ ## that also has to be returned by the cycle validity statements
157
+
138
158
  if all_cycles_valid == true
159
+ cycle_chain = []
139
160
  product.cycles.each do |cycle|
140
- minute_at_which_to_add = minute + cycle.time_since_prev_cycle.minutes*60
141
- #puts "minute at which to add is: #{minute_at_which_to_add}"
142
- #puts minutes.keys.to_s
143
- if minutes[minute_at_which_to_add]
161
+ epoch_at_which_to_add = epoch + cycle.time_since_prev_cycle.minutes*60
162
+ cycle_to_add = cycle.dup
163
+ cycle_to_add.origin_epoch = epoch_at_which_to_add
164
+ cycle_to_add.cycle_chain = cycle_chain
165
+ if minutes[epoch_at_which_to_add]
166
+
167
+ add_to_previous_rolling_n_minutes(minutes,epoch_at_which_to_add,cycle_to_add)
144
168
 
145
- minutes[minute_at_which_to_add].cycles << cycle
146
-
147
- #puts "these are the cycles---------"
148
- #puts minutes[minute_at_which_to_add].cycles.to_s
169
+ minutes[epoch_at_which_to_add].cycles << cycle_to_add
149
170
 
171
+ cycle_chain << cycle_to_add.id.to_s
150
172
  else
151
- raise "necessary minute not in range."
173
+ #raise "necessary minute not in range."
152
174
  end
153
175
  end
154
176
  end
155
177
  end
156
178
  end
157
-
158
- #puts minutes.to_s
159
-
160
179
  minutes
161
-
162
180
  end
163
-
164
181
  end
165
-
166
182
  end
167
-
@@ -2,6 +2,11 @@ class Auth::Work::Cycle
2
2
 
3
3
  include Mongoid::Document
4
4
 
5
+ ## for aggs.
6
+ attr_accessor :cycle_index
7
+
8
+ field :origin_epoch
9
+
5
10
  embedded_in :minutes, :class_name => "Auth::Work::Minute", :polymorphic => true
6
11
 
7
12
  embedded_in :products, :class_name => Auth.configuration.product_class, :polymorphic => true
@@ -9,11 +14,24 @@ class Auth::Work::Cycle
9
14
  embeds_many :templates, :class_name => "Auth::Work::Template"
10
15
 
11
16
  ## each cycle will have a limit
12
- field :capacity, type: Integer
17
+ field :capacity, type: Integer, default: 0
18
+
19
+ ## there will have to be another field, saying workers who can do it, and entities who can do it.
20
+ field :workers_available, type: Array
21
+
13
22
 
14
23
  ## it will have a list of workers to whom it is assigned
15
24
  field :workers_assigned, type: Array
25
+
16
26
 
27
+ ## the available entities, these are set at the time of creating the minutes.
28
+ field :entities_available, type: Array
29
+
30
+
31
+ ## the entities assigned, finally.
32
+ field :entities_assigned, type: Array
33
+
34
+
17
35
  ## it has to have a priority score
18
36
  field :priority, type: Float
19
37
 
@@ -36,9 +54,11 @@ class Auth::Work::Cycle
36
54
  =end
37
55
  field :requirements, type: Hash
38
56
 
39
-
40
57
  field :cycle_code, type: String
41
58
 
59
+ ## the ids of the related cycles.
60
+ field :cycle_chain, type: Array
61
+
42
62
  before_save do |document|
43
63
  document.cycle_code = BSON::ObjectId.new.to_s unless document.cycle_code
44
64
  end
@@ -70,81 +90,134 @@ class Auth::Work::Cycle
70
90
  end
71
91
 
72
92
  def requirements_satisfied(epoch,location_id)
73
- #begin
74
- #puts "came to requirements satisfied"
75
- Auth.configuration.location_class.constantize.all.each do |l|
76
- puts l.attributes.to_s
77
- end
78
- location = Auth.configuration.location_class.constantize.find(location_id)
79
-
80
- #puts "location found :#{location}"
81
- #puts "epoch : #{epoch}, and location id: #{location_id}"
82
- time_for_query = Time.at(epoch)
83
- applicable_schedules = Auth::Work::Schedule.collection.find({
84
- "$and" => [
85
- {
86
- "location_id" => location_id
87
- },
88
- {
89
- "start_time" => {
90
- "$lte" => time_for_query
91
- }
92
- },
93
- {
94
- "end_time" => {
95
- "$gte" => time_for_query
96
- }
93
+
94
+ #puts "came to requirements satisfied"
95
+ Auth.configuration.location_class.constantize.all.each do |l|
96
+ puts l.attributes.to_s
97
+ end
98
+ location = Auth.configuration.location_class.constantize.find(location_id)
99
+
100
+ #puts "location found :#{location}"
101
+ #puts "epoch : #{epoch}, and location id: #{location_id}"
102
+ time_for_query = Time.at(epoch)
103
+ applicable_schedules = Auth::Work::Schedule.collection.find({
104
+ "$and" => [
105
+ {
106
+ "location_id" => location_id
107
+ },
108
+ {
109
+ "start_time" => {
110
+ "$lte" => time_for_query
97
111
  }
98
- ]
99
- })
100
-
112
+ },
113
+ {
114
+ "end_time" => {
115
+ "$gte" => time_for_query
116
+ }
117
+ }
118
+ ]
119
+ })
120
+
101
121
 
102
122
 
103
- #puts "applicable schedules:"
104
- #puts applicable_schedules.to_s
123
+ #puts "applicable schedules:"
124
+ #puts applicable_schedules.to_s
105
125
 
106
- applicable_schedules = applicable_schedules.to_a
126
+ applicable_schedules = applicable_schedules.to_a
107
127
 
108
- return false if (applicable_schedules.blank? || applicable_schedules.size == 0)
109
-
110
- #puts "there are applicable schedules"
128
+ return false if (applicable_schedules.blank? || applicable_schedules.size == 0)
129
+
130
+ #puts "there are applicable schedules"
111
131
 
112
- req = self.requirements.deep_dup
113
- #puts "req are:"
114
- #puts req.to_s
115
-
116
- applicable_schedules.map!{|c| c = Mongoid::Factory.from_db(Auth::Work::Schedule,c)}
132
+ req = self.requirements.deep_dup
133
+ #puts "req are:"
134
+ #puts req.to_s
135
+
136
+ applicable_schedules.map!{|c| c = Mongoid::Factory.from_db(Auth::Work::Schedule,c)}
117
137
 
118
- applicable_schedules.each do |schedule|
119
-
120
- schedule_for_object = schedule.for_object_class.constantize.find(schedule.for_object_id)
121
-
122
- #puts "schedule for object is: #{schedule_for_object}"
138
+ ## here basically suppose you have n applicable schedules.
139
+ ## you need to combine them into cycle categories and see how many combinations you get out of it.
123
140
 
124
- ## so here the thing is that it can have many cycle types.
141
+ available_resources = {}
125
142
 
126
- schedule_for_object.cycle_types.keys.each do |type|
127
- req[type] = req[type] - 1 if req[type]
128
- end
129
-
130
- #puts "req is: #{req}"
143
+ applicable_schedules.each do |schedule|
144
+
145
+ schedule_for_object = schedule.for_object_class.constantize.find(schedule.for_object_id)
146
+
147
+ schedule_for_object.cycle_types.keys.each do |type|
148
+ #req[type] = req[type] - 1 if req[type]
149
+ available_resources[type] = 0 unless available_resources[type]
150
+ available_resources[type]+=1
151
+ end
131
152
 
153
+ end
154
+
155
+ ## now we have certain type counts necessary for this cycle.
156
+ ## now how to return the available capacity.
157
+ #k = req.values.uniq
158
+ #return true if ((k[0] == 0) && (k.size == 1))
159
+ #return false
160
+
161
+ ## so how to split into multiples ?
162
+ ## just do it sequentially.
163
+ failed = false
164
+ while failed == false
165
+ self.requirements.keys.each do |req|
166
+ failed = true unless available_resources[req]
167
+ break unless available_resources[req]
168
+ failed = true if available_resources[req] < self.requirements[req]
169
+ break if available_resources[req] < self.requirements[req]
170
+ available_resources[req] -= self.requirements[req]
132
171
  end
133
-
134
- k = req.values.uniq
172
+ self.capacity+=1 if failed == false
173
+ end
174
+
175
+ ## now this becomes the cycle capacity.
176
+ ## but only for the origin minute.
177
+
178
+ return self.capacity > 0
135
179
 
180
+ end
136
181
 
137
- return true if ((k[0] == 0) && (k.size == 1))
138
- return false
139
182
 
140
- #rescue
183
+ ###########################################################
184
+ ##
185
+ ##
186
+ ## BOOKINGS.
187
+ ##
188
+ ##
189
+ ###########################################################
190
+
191
+
141
192
 
142
- # raise "location id provided to cycle does not exist"
193
+ def after_book
194
+ Auth::Work::Minute.get_affected_minutes(self.start_time,self.end_time,self.workers_assigned,self.entities_assigned).each do |minute|
143
195
 
144
- #end
196
+ ## each cycle has its index as cycle_index
197
+ ## this is used to update the cycles.
198
+
199
+ end
200
+ end
145
201
 
202
+ def book
203
+ after_book
146
204
  end
147
205
 
206
+
207
+ ## so the search criteria is
208
+ ## where entity_ids == [n1,n2,n3], or worker_ids= [y1,y2,y3]
209
+ ## range is such that
210
+ ## if (end time or start time) of any cycle is (from this minute -> time of end of this cycle)
211
+ ## or if start time <= this minute, and end time is >= minute of end of this cycle.
212
+ ## for any of those cycles -> if priority is applicable, then block, and block all related chains.
213
+ ## how to block the related chains ?
214
+ ## a cycle has to store all its related chain ids, and also its 30 minute references.
215
+ ## so that's it.
216
+ ## this is something to execute tomorrow.
217
+
218
+ ## so plan for today
219
+ ##
220
+
148
221
  end
149
222
 
150
223
 
@@ -3,4 +3,128 @@ class Auth::Work::Minute
3
3
  embeds_many :cycles, :class_name => "Auth::Work::Cycle", :as => :minute_cycles
4
4
  field :time, type: Time
5
5
  field :geom, type: Array
6
+
7
+ ## returns all minutes which have affected cycles , only containing the affected cycles.
8
+ def self.get_affected_minutes(cycle_start_time,cycle_end_time,cycle_workers_assigned,cycle_entities_assigned)
9
+ response = Auth::Work::Minute.collection.aggregate([
10
+ {
11
+ "$match" => {
12
+ "cycles" => {
13
+ "$elemMatch" => {
14
+ "$and" => [
15
+ {
16
+ "$or" => [
17
+ {
18
+ "start_time" => {
19
+ "$gte" => cycle_start_time,
20
+ "$lte" => cycle_end_time
21
+ }
22
+ },
23
+ {
24
+ "end_time" => {
25
+ "$gte" => cycle_start_time,
26
+ "$lte" => cycle_end_time
27
+ }
28
+ },
29
+ {
30
+ "$and" => [
31
+ {
32
+ "start_time" => {
33
+ "$lte" => cycle_start_time
34
+ }
35
+ },
36
+ {
37
+ "end_time" => {
38
+ "$gte" => cycle_end_time
39
+ }
40
+ }
41
+ ]
42
+ }
43
+ ]
44
+ },
45
+ {
46
+ "$or" => [
47
+ {
48
+ "workers_available" => {
49
+ "$in" => cycle_workers_assigned
50
+ }
51
+ },
52
+ {
53
+ "entities_available" => {
54
+ "$in" => cycle_entities_assigned
55
+ }
56
+ }
57
+ ]
58
+ }
59
+ ]
60
+ }
61
+ }
62
+ }
63
+ },
64
+ {
65
+ "$unwind" => "cycles",
66
+ "includeArrayIndex" => "cycle_index"
67
+ },
68
+ {
69
+ "$match" => {
70
+ "$and" => [
71
+ {
72
+ "$or" => [
73
+ {
74
+ "cycles.start_time" => {
75
+ "$gte" => cycle_start_time,
76
+ "$lte" => cycle_end_time
77
+ }
78
+ },
79
+ {
80
+ "cycles.end_time" => {
81
+ "$gte" => cycle_start_time,
82
+ "$lte" => cycle_end_time
83
+ }
84
+ },
85
+ {
86
+ "$and" => [
87
+ {
88
+ "cycles.start_time" => {
89
+ "$lte" => cycle_start_time
90
+ }
91
+ },
92
+ {
93
+ "cycles.end_time" => {
94
+ "$gte" => cycle_end_time
95
+ }
96
+ }
97
+ ]
98
+ }
99
+ ]
100
+ },
101
+ {
102
+ "$or" => [
103
+ {
104
+ "cycles.workers_available" => {
105
+ "$in" => cycle_workers_assigned
106
+ }
107
+ },
108
+ {
109
+ "cycles.entities_available" => {
110
+ "$in" => cycle_entities_assigned
111
+ }
112
+ }
113
+ ]
114
+ }
115
+ ]
116
+ }
117
+ },
118
+ {
119
+ "$group" => {
120
+ "_id" => "$_id",
121
+ "cycles" => {
122
+ "$push" => "$cycles"
123
+ }
124
+ }
125
+ }
126
+ ])
127
+ response
128
+ end
129
+
6
130
  end