meetalendar 0.0.1 → 0.0.2

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
  SHA256:
3
- metadata.gz: 73604a9cc0b86b606d42ffe229c51672b3ea933edb58c1392c65b15a11f1aead
4
- data.tar.gz: a0e8b7fcd6e9c163e054933198a0b3aafe224738ce541081b96fc1db11f28b6c
3
+ metadata.gz: ae3d433c1520818ba3b4ae9234da0d298dca9295a963a44d8c006560101f285a
4
+ data.tar.gz: adf92c0d823795fb1c3d7409c6c9f2d48d04fc4e908bca0360c4c4fa6eb4e9e0
5
5
  SHA512:
6
- metadata.gz: a50451ed147c3bb6b9b45721bb8ca0a01af9be07f47139f027aed7789358b489f6de88c3cbabc8ee6cbfbb8081e10289c97d1649e52e3b3907a1dfbb4bd73508
7
- data.tar.gz: 286e5134a8173857b29d7425795ab11eb1eb2e373ecfcdaff1dc18c6108a31cde45ef672bfb5e79fee0d83d104714e907c4b90d82df6d7841517555495222638
6
+ metadata.gz: 238d482fa5cc2eea84f5a7f95c77b583bb9692ecf75ef4c96c19b9d862f0edb1ebbfc173108fd6c1ceab7c145bf10c52bcc18922801990df507b887750f795ab
7
+ data.tar.gz: 3399deaac0a1a5f86ec2bdb4fb1bf25e7d03eb971ab6c4df9d7710a76ba05fb2c3959dba52cf28f2f3dfe95adff8cc2b066f4a698263cff3c5320dccdf5b7b7d
data/.gitignore CHANGED
@@ -14,3 +14,4 @@ Gemfile.lock
14
14
  .ruby-version
15
15
  /.sass-cache
16
16
  coverage/
17
+ meetalendar-*.gem
data/README.md CHANGED
@@ -42,7 +42,17 @@ $ bundle exec rake db:migrate
42
42
  ```
43
43
 
44
44
  ## Contributing
45
- Just try your best.
45
+ Just try your best. Maybe you can achieve one of these goals.
46
+
47
+ - [_] Wenn keine "approved cities" eingetragen sind, (oder wenn ein * oder ähnlich eingetragen ist) dann sollen alle Termine übertragen werden, egal in welcher Stadt sie stattfinden.
48
+ - [_] Wenn keine City in der Venue im Event eingetragen ist, dann soll dieser Termin erstmal mit übertragen werden, und sofern bei einer späteren Syncronisation festgestellt wird, dass dieses bereits im GCal eingetragene Event doch nicht hätte übertragen werden sollen, weil es in einer "nicht approvten" Stadt stattfindet, dann soll es wieder aus dem GCal gelöscht werden. (Aber nur für zukünftige Events, nicht rückwirkend auf jene, die schon stattgefunden haben.)
49
+ - [_] Wenn die "approvten cities" geändert werden, sollen ebenfalls die Termine, die noch in der Zukunft liegen entweder hinzugefügt oder gelöscht werden im GCal.
50
+
51
+ - Erweiterung der Admin-Ansicht, sodass auch einzelne bisher ausgeschlossene Events "von Hand" hinzugefügt werden können.
52
+ - [_] Noch mal darüber sprechen, woher die Events kommen sollen? So eine Art von Suche bei der die bereits selektierten/gespeicherten Gruppen ihre nächsten (für 3 Monate) Events anzeigen und man diese trotz abweichender Städte in den GCal übertregen kann?
53
+
54
+ - [_] Kann man erkennen, ob ein Termin "von Hand" eingetragen wurde (bei Meetup) oder ob es ein sich einfach jeden Monat zu einem bestimmten Termin wiederholt, aber noch keine Details eingetragen sind.
55
+ - Bei von Hand eingetragenen Terminen, die auch weit in der Zukunft liegen können, sollte man diese mit übertragen, wenn sie aber wiederholt werden ist ab 3 Monaten in der Zukunft wohl sowieso noch kein sinnvoller Inhalt vorhanden und diese sollten dann nicht übertragen werden.
46
56
 
47
57
  ## License
48
58
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -47,12 +47,6 @@ module Comfy::Admin::Meetalendar::MeetupsCalendarSyncer
47
47
  credentials
48
48
  end
49
49
 
50
- def self.add_to_key(current_key_data, to_add_data)
51
- return_key_data = current_key_data.nil? ? [] : current_key_data.class == [].class ? current_key_data : [].push(current_key_data)
52
- return_key_data.push(to_add_data)
53
- return_key_data
54
- end
55
-
56
50
  def self.get_path_authorized(path, args = {})
57
51
  return_hash = {}
58
52
  client = HTTPClient.new
@@ -75,7 +69,7 @@ module Comfy::Admin::Meetalendar::MeetupsCalendarSyncer
75
69
  request_query_args = {"client_id": meetup_credentials["client_id"], "client_secret": meetup_credentials["client_secret"], "grant_type": "refresh_token", "refresh_token": "#{current_tokens["refresh_token"]}"}
76
70
  post_return = client.post_content(request_uri, request_query_args)
77
71
 
78
- if post_return.nil? || post_return.status == 401
72
+ if post_return.nil? || post_return.status == Rack::Utils::SYMBOL_TO_STATUS_CODE[:unauthorized]
79
73
  Rails.logger.error "Authorization with current token failed and token could not be refreshed. Was authorization to meetup api revoked?"
80
74
  raise ::ActiveResource::UnauthorizedAccess, "To access this path you need to have authenticated the Meetup API successfully."
81
75
  else
@@ -88,8 +82,8 @@ module Comfy::Admin::Meetalendar::MeetupsCalendarSyncer
88
82
  request_query_args = args.merge({"access_token" => (current_tokens["access_token"])})
89
83
  result = client.request("GET", request_uri, request_query_args)
90
84
 
91
- if result.nil? || result.status == 401
92
- # really no success
85
+ if result.nil? || result.status != Rack::Utils::SYMBOL_TO_STATUS_CODE[:ok]
86
+ # still no success
93
87
  Rails.logger.error "Authorization with current token failed, token was refreshed but authorization still fails. Was authorization to meetup api revoked?"
94
88
  raise ::ActiveResource::UnauthorizedAccess, "To access this path you need to have authenticated the Meetup API successfully."
95
89
  else
@@ -105,32 +99,61 @@ module Comfy::Admin::Meetalendar::MeetupsCalendarSyncer
105
99
  parsed_path
106
100
  end
107
101
 
108
- def self.gather_meetups_in_approved_cities(time_now)
102
+ def self.gather_selected_events(time_now)
109
103
  @meetups = MeetupGroup.all
110
104
  group_ids = @meetups.map{ |meetup| meetup.group_id }
111
105
  group_ids_approved_cities = @meetups.map{|meetup| ["#{meetup.group_id}", meetup.approved_cities.downcase.split(%r{,\s*})]}.to_h
112
106
 
113
107
  request_result = Comfy::Admin::Meetalendar::MeetupsCalendarSyncer.get_path_authorized("/find/upcoming_events", {"page": 200})
114
108
 
115
- upcoming_events = request_result.nil? ? {} : request_result
116
- upcoming_events = upcoming_events.nil? || upcoming_events.empty? ? [] : upcoming_events["events"]
117
- upcoming_events_of_groups = upcoming_events.select{|event|
118
- !event["group"].nil? &&
119
- group_ids.include?(event["group"]["id"]) &&
120
- !event["venue"].nil? &&
121
- group_ids_approved_cities["#{event["group"]["id"]}"].include?(event['venue']['city'].to_s.downcase)}
122
-
123
- grouped_upcoming_events = upcoming_events_of_groups.group_by{|event| event["group"]["id"]}
124
- # NOTE(Schau): Very likely i will be able to refactor this to be more clear.
125
- limited_upcoming_events = Hash[grouped_upcoming_events.map{|k, v| [k, v.select{|event| Time.at(Rational(event["time"].to_i, 1000)) > time_now}.sort_by{|event| event["time"].to_i}.take(2)]}].select{|k, v| v.any?}
126
- listed_upcoming_events = limited_upcoming_events.map{|k, v| v.first}
109
+ upcoming_events = request_result.nil? || request_result.empty? ? [] : request_result.dig("events")
110
+ selected_groups_upcoming_events = upcoming_events.select{|event| group_ids.include?(event.dig("group", "id"))}
111
+
112
+ upcoming_events_of_groups = selected_groups_upcoming_events.select do |event|
113
+ selected_group_has_approved_cities = !group_ids_approved_cities.dig("#{event.dig("group", "id")}").empty?
114
+
115
+ event_has_group = !event.dig("group").nil?
116
+ events_group_id_is_in_selected_group_ids = group_ids.include?(event.dig("group", "id"))
117
+
118
+ event_has_no_venue = event.dig("venue").nil?
119
+ event_has_venue = !event.dig("venue").nil?
120
+
121
+ event_venue_in_approved_cities = !selected_group_has_approved_cities ? true : group_ids_approved_cities.dig("#{event.dig("group", "id")}").include?(event.dig('venue', 'city').to_s.downcase)
122
+
123
+ !selected_group_has_approved_cities ||
124
+ (selected_group_has_approved_cities &&
125
+ event_has_group && events_group_id_is_in_selected_group_ids &&
126
+ (event_has_no_venue || (event_has_venue && event_venue_in_approved_cities)))
127
+ end
128
+
129
+ grouped_upcoming_events = upcoming_events_of_groups.group_by{|event| event.dig("group", "id")}
130
+ limited_upcoming_events = grouped_upcoming_events.map{|k, v| v.select{|event| Time.at(Rational(event.dig("time").to_i, 1000)) > time_now}}.first
127
131
  end
128
132
 
129
- def self.sync_meetups_to_calendar(listed_upcoming_events)
133
+ def self.sync_meetups_to_calendar(listed_upcoming_events, calendar_id, time_now, time_in_future)
130
134
  calendar_service = Google::Apis::CalendarV3::CalendarService.new
131
135
  calendar_service.client_options.application_name = GOOGLE_CALENDAR_AUTH_APPLICATION_NAME
132
136
  calendar_service.authorization = authorize
133
137
 
138
+ begin
139
+ all_future_google_calendar_events = calendar_service.list_events(calendar_id, {time_max: DateTime.parse(time_in_future.to_s).to_s, time_min: DateTime.parse(time_now.to_s).to_s})
140
+ rescue => exception
141
+ Rails.logger.error "An exception occurred while loading current events from the google calendar. Exception: #{exception.message}"
142
+ raise ::ActiveResource::ClientError, "Could not load current events from the google calendar."
143
+ end
144
+
145
+ to_keep_event_gcal_ids = listed_upcoming_events.map{|mu_event| Digest::MD5.hexdigest(mu_event.dig('id').to_s)}
146
+ to_delete_event_ids = all_future_google_calendar_events.items.map{|gcal_event| gcal_event.id}.select{|gcal_event_id| !to_keep_event_gcal_ids.include?(gcal_event_id)}
147
+
148
+ to_delete_event_ids.each{ |event_id|
149
+ begin
150
+ calendar_service.delete_event(calendar_id, event_id)
151
+ rescue => exception
152
+ Rails.logger.error "An exception occurred while deleting unsubscribed events from the google calendar. Exception: #{exception.message}"
153
+ raise ::ActiveResource::ClientError, "Could not delete unsubscribed events from the google calendar."
154
+ end
155
+ }
156
+
134
157
  listed_upcoming_events.each{ |event|
135
158
  if event.key?('venue')
136
159
  venue_name_adress = event['venue']['name'] != event['venue']['address_1'] ? "#{event['venue']['name']}, #{event['venue']['address_1']}" : "#{event['venue']['address_1']}"
@@ -164,10 +187,10 @@ module Comfy::Admin::Meetalendar::MeetupsCalendarSyncer
164
187
 
165
188
  new_event = Google::Apis::CalendarV3::Event.new(new_event_hash)
166
189
  begin
167
- calendar_service.update_event('primary', new_event.id, new_event)
190
+ calendar_service.update_event(calendar_id, new_event.id, new_event)
168
191
  rescue # TODO(Schau): If possible, figure out the exact exceptions to minimize "braodness of healing"
169
192
  begin
170
- calendar_service.insert_event('primary', new_event)
193
+ calendar_service.insert_event(calendar_id, new_event)
171
194
  rescue => exception
172
195
  Rails.logger.error "An exception occurred while updating or inserting events into the google calendar. Exception: #{exception.message}"
173
196
  raise ::ActiveResource::ClientError, "Could not update or insert event into the google calendar."
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Meetalendar
4
4
 
5
- VERSION = "0.0.1"
5
+ VERSION = "0.0.2"
6
6
 
7
7
  end
@@ -2,13 +2,13 @@ namespace :meetalendar do
2
2
  desc 'Syncronize selected meetup groups events with the configured google calendar.'
3
3
  task :syncronize => :environment do
4
4
  require 'comfy/admin/meetalendar/meetups_calendar_syncer'
5
- Comfy::Admin::Meetalendar::MeetupsCalendarSyncer.sync_meetups_to_calendar(Comfy::Admin::Meetalendar::MeetupsCalendarSyncer.gather_meetups_in_approved_cities(Time.now))
5
+ Comfy::Admin::Meetalendar::MeetupsCalendarSyncer.sync_meetups_to_calendar(Comfy::Admin::Meetalendar::MeetupsCalendarSyncer.gather_selected_events(Time.now), 'andreasrschau@gmail.com', Time.now, Time.now + 1.year)
6
6
  end
7
7
 
8
8
 
9
9
  # desc 'Syncronize selected meetup groups events with the configured google calendar.'
10
10
  # task :testoncli => :environment do
11
11
  # require 'comfy/admin/meetalendar/meetups_calendar_syncer'
12
- # Comfy::Admin::Meetalendar::MeetupsCalendarSyncer.gather_meetups_in_approved_cities(Time.now)
12
+ # Comfy::Admin::Meetalendar::MeetupsCalendarSyncer.gather_selected_events(Time.now)
13
13
  # end
14
14
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: meetalendar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andreas Schau @ HicknHack
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-29 00:00:00.000000000 Z
11
+ date: 2019-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails