meetalendar 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
         
     |