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 +4 -4
- data/.gitignore +1 -0
- data/README.md +11 -1
- data/app/models/comfy/admin/meetalendar/meetups_calendar_syncer.rb +48 -25
- data/lib/meetalendar/version.rb +1 -1
- data/lib/tasks/meetalendar_tasks.rake +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae3d433c1520818ba3b4ae9234da0d298dca9295a963a44d8c006560101f285a
|
4
|
+
data.tar.gz: adf92c0d823795fb1c3d7409c6c9f2d48d04fc4e908bca0360c4c4fa6eb4e9e0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 238d482fa5cc2eea84f5a7f95c77b583bb9692ecf75ef4c96c19b9d862f0edb1ebbfc173108fd6c1ceab7c145bf10c52bcc18922801990df507b887750f795ab
|
7
|
+
data.tar.gz: 3399deaac0a1a5f86ec2bdb4fb1bf25e7d03eb971ab6c4df9d7710a76ba05fb2c3959dba52cf28f2f3dfe95adff8cc2b066f4a698263cff3c5320dccdf5b7b7d
|
data/.gitignore
CHANGED
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 ==
|
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
|
92
|
-
#
|
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.
|
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? ?
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
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(
|
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(
|
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."
|
data/lib/meetalendar/version.rb
CHANGED
@@ -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.
|
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.
|
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.
|
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-
|
11
|
+
date: 2019-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|