Пример #1
0
 def trans():
     event = Event.get(event_key)
     if not event:  # event can be None if the CLEANUP cron_job is being run
         return
     new_first_start_date = event.get_first_event_date()
     if event.first_start_date != new_first_start_date:
         event.first_start_date = new_first_start_date
         event.put()
Пример #2
0
def _process_event_reminder(reminder_key):
    reminder = EventReminder.get(reminder_key)

    service_user = reminder.service_user
    settings = get_solution_settings(service_user)
    event = Event.get_by_id(reminder.event_id,
                            parent_key(service_user, settings.solution))

    if event and reminder.event_start_epoch in event.start_dates:
        now_ = now()
        if (now_ +
                reminder.remind_before) > (reminder.event_start_epoch +
                                           timezone_offset(settings.timezone)):
            if event.place:
                place = "\n@ " + event.place + "\n"
            else:
                place = ""

            dt = datetime.datetime.fromtimestamp(reminder.event_start_epoch)
            language = settings.main_language or DEFAULT_LANGUAGE
            when = "%s, %s" % (format_date(dt, format='full', locale=language),
                               format_time(dt, format='short',
                                           locale=language))
            reminderMessage = "Reminder:\n\nTitle:\n%s\n\nWhen:\n%s\n%s\nDescription:\n%s" % (
                event.title, when, place, event.description)
            main_branding = get_solution_main_branding(service_user)

            human_user = get_human_user_from_app_user(reminder.human_user)
            members = list()
            members.append(human_user.email())
            users.set_user(reminder.service_user)
            try:
                messaging.send(parent_key=None,
                               parent_message_key=None,
                               message=reminderMessage,
                               answers=[],
                               flags=Message.FLAG_ALLOW_DISMISS,
                               members=members,
                               branding=main_branding.branding_key,
                               tag=None,
                               service_identity=reminder.service_identity)
            finally:
                users.clear_user()

            reminder.status = EventReminder.STATUS_REMINDED
            reminder.put()
    else:
        reminder.status = EventReminder.STATUS_REMINDED
        reminder.put()
Пример #3
0
def _populate_uit_events(sln_settings, uitdatabank_secret, uitdatabank_key,
                         external_id, uitdatabank_actors, changed_since):
    logging.debug("process event with id: %s", external_id)
    detail_success, detail_result = _get_uitdatabank_events_detail(
        uitdatabank_secret, uitdatabank_key, external_id)
    if not detail_success:
        logging.warn("Failed to get detail for cdbid: %s\n%s" %
                     (external_id, detail_result))
        return None

    if uitdatabank_secret and changed_since:
        if detail_result["lastupdated"] < (changed_since * 100):
            return None

    if DEBUG:
        logging.warn("detail result: %s", detail_result)

    event_parent_key = parent_key(sln_settings.service_user,
                                  sln_settings.solution)
    event = Event.all().ancestor(event_parent_key).filter(
        "source =",
        Event.SOURCE_UITDATABANK_BE).filter("external_id =",
                                            external_id).get()
    if not event:
        event = Event(parent=event_parent_key,
                      source=Event.SOURCE_UITDATABANK_BE,
                      external_id=external_id)

    event.calendar_id = sln_settings.default_calendar
    events = [event]

    uitdatabank_created_by = detail_result.get("createdby", None)
    logging.debug("uitdatabank_created_by: %s", uitdatabank_created_by)
    uitdatabank_lastupdated_by = detail_result.get("lastupdatedby", None)
    logging.debug("uitdatabank_lastupdated_by: %s", uitdatabank_lastupdated_by)

    if uitdatabank_created_by or uitdatabank_lastupdated_by:
        if uitdatabank_created_by and uitdatabank_created_by not in uitdatabank_actors:
            uitdatabank_actors[uitdatabank_created_by] = []
        if uitdatabank_lastupdated_by and uitdatabank_lastupdated_by not in uitdatabank_actors:
            uitdatabank_actors[uitdatabank_lastupdated_by] = []

        origanizer_settings = []
        if uitdatabank_created_by:
            origanizer_settings.extend(
                uitdatabank_actors[uitdatabank_created_by])
        if uitdatabank_lastupdated_by and uitdatabank_created_by != uitdatabank_lastupdated_by:
            origanizer_settings.extend(
                uitdatabank_actors[uitdatabank_lastupdated_by])

        logging.debug("len(origanizer_settings): %s", len(origanizer_settings))
        for organizer_sln_settings in origanizer_settings:
            organizer_event_parent_key = parent_key(
                organizer_sln_settings.service_user,
                organizer_sln_settings.solution)
            organizer_event = Event.all().ancestor(
                organizer_event_parent_key).filter(
                    "source =", Event.SOURCE_UITDATABANK_BE).filter(
                        "external_id =", external_id).get()
            if not organizer_event:
                organizer_event = Event(parent=organizer_event_parent_key,
                                        source=Event.SOURCE_UITDATABANK_BE,
                                        external_id=external_id)

            organizer_event.calendar_id = organizer_sln_settings.default_calendar
            events.append(organizer_event)

    r_event_detail = detail_result["eventdetails"]["eventdetail"]
    if not r_event_detail:
        logging.warn('Missing eventdetail')
        return None

    if isinstance(r_event_detail, list):
        for x in r_event_detail:
            if x['lang'] == sln_settings.main_language:
                r_event_detail = x
                break
        else:
            r_event_detail = r_event_detail[0]

    event_title = r_event_detail["title"]
    event_description = r_event_detail.get(
        "shortdescription", r_event_detail.get("longdescription", u""))

    if "physical" in detail_result["location"]["address"]:
        location = detail_result["location"]["address"]["physical"]
        if location.get("street", None):
            if uitdatabank_secret:
                event_place = "%s %s, %s %s" % (
                    location["street"]["value"], location.get("housenr", ""),
                    location["zipcode"], location["city"]["value"])
            else:
                event_place = "%s %s, %s %s" % (
                    location["street"], location.get(
                        "housenr", ""), location["zipcode"], location["city"])
        else:
            if uitdatabank_secret:
                event_place = "%s %s" % (location["zipcode"],
                                         location["city"]["value"])
            else:
                event_place = "%s %s" % (location["zipcode"], location["city"])
    else:
        event_place = detail_result["location"]["address"]["virtual"]["title"]

    r_organizer = detail_result.get('organiser')
    for k in ('actor', 'actordetails', 'actordetail', 'title'):
        if not r_organizer:
            break
        r_organizer = r_organizer.get(k)
    event_organizer = r_organizer

    r_timestamps = detail_result["calendar"].get("timestamps")
    if not r_timestamps:
        logging.debug(
            "skipping event because we could not determine starttime for: \n%s",
            pprint.pformat(detail_result))
        return None

    event_start_dates, event_end_dates = get_event_start_and_end_dates(
        r_timestamps, v2=uitdatabank_secret)
    if not event_start_dates:
        logging.info(
            "Skipping event because it had no starttime (list) for:\n%s",
            pprint.pformat(detail_result))
        return None

    for event in events:
        event.title = event_title
        event.description = event_description
        event.place = event_place
        event.organize = event_organizer
        event.last_start_date = max(event_start_dates)
        event.start_dates = event_start_dates
        event.end_dates = event_end_dates
        event.first_start_date = event.get_first_event_date()
    return events
Пример #4
0
def _process_events(service_user, page):
    sln_settings = get_solution_settings(service_user)
    if not sln_settings:
        logging.error(
            "check_for_events_in_fr_deuillabarre failed: sln_settings found for %s",
            service_user)
        return
    if SolutionModule.AGENDA not in sln_settings.modules:
        logging.error(
            "check_for_events_in_fr_deuillabarre failed: module found for %s",
            service_user)
        return

    url = u"http://www.mairie-deuillabarre.fr/agenda?page=%s" % page
    response = urlfetch.fetch(url, deadline=60)
    if response.status_code != 200:
        logging.error(
            "Could not check for events in fr_deuillabarre page %s.\n%s",
            page,
            response.content,
            _suppress=False)
        return

    tree = html.fromstring(response.content.decode("utf8"))

    events = tree.xpath(
        '//form[@id="icagenda-list"]//div[@class="event ic-event ic-clearfix"]'
    )
    to_put = []
    for event in events:
        h2_title = event.getchildren()[1].getchildren()[0].getchildren(
        )[0].getchildren()[0]
        div_place = event.getchildren()[1].getchildren()[2]

        title = _filter_chars(h2_title.getchildren()[0].text)
        url = h2_title.getchildren()[0].xpath("@href")[0]
        place = _filter_chars(
            div_place.text_content() if div_place is not None else u"")
        place = place.replace("Lieu: ", "")

        if not (url.startswith("http://") or url.startswith("https://")):
            url = u"http://www.mairie-deuillabarre.fr%s" % url
        url = unicode(url) if not isinstance(url, unicode) else url
        t = _get_event_details(url)
        if not t:
            continue
        start_epochs, end_hour_epochs, description = t

        event_parent_key = parent_key(service_user, sln_settings.solution)
        event = Event.all().ancestor(event_parent_key).filter(
            "source =", Event.SOURCE_SCRAPER).filter("external_id =",
                                                     url).get()
        if not event:
            event = Event(parent=event_parent_key,
                          source=Event.SOURCE_SCRAPER,
                          external_id=url)

        event.calendar_id = sln_settings.default_calendar
        event.external_link = url
        event.title = title
        event.description = description
        event.place = place
        event.first_start_date = start_epochs[0]
        event.last_start_date = start_epochs[-1]
        event.start_dates = start_epochs
        event.end_dates = end_hour_epochs
        to_put.append(event)

    if to_put:
        db.put(to_put)

    if events:
        deferred.defer(_process_events, service_user, page + 1)
    else:
        sln_settings.put_identity_pending = True
        sln_settings.put()
Пример #5
0
def update_statistic():
    # Completely rebuilds statistics on run.

    current_date = now()
    broadcast_count_dict = {}
    for news_item in get_news_of_last_month():
        service_email = get_service_user_from_service_identity_user(
            news_item.sender).email()
        if service_email not in broadcast_count_dict:
            broadcast_count_dict[service_email] = 1
        else:
            broadcast_count_dict[service_email] += 1

    future_event_count_dict = {}

    for future_event_key in Event.get_future_event_keys(current_date):
        service_email = future_event_key.parent().name()
        if service_email not in future_event_count_dict:
            future_event_count_dict[service_email] = 1
        else:
            future_event_count_dict[service_email] += 1

    static_content_count_dict = {}

    for static_content_key in SolutionStaticContent.get_all_keys():
        service_email = static_content_key.parent().name()
        if service_email not in static_content_count_dict:
            static_content_count_dict[service_email] = 1
        else:
            static_content_count_dict[service_email] += 1

    unanswered_question_count_dict = {}

    # find the oldest, unanswered question per customer and add it to the statistics
    for unanswered_question in SolutionInboxMessage.get_all_unanswered_questions(
            5):
        service_email = unanswered_question.service_user.email()
        if unanswered_question.question_asked_timestamp != 0:
            if not service_email in unanswered_question_count_dict:
                unanswered_question_count_dict[
                    service_email] = unanswered_question.question_asked_timestamp
            elif unanswered_question.question_asked_timestamp < unanswered_question_count_dict[
                    service_email]:
                unanswered_question_count_dict[
                    service_email] = unanswered_question.question_asked_timestamp

    # dict with as keys the app id from the city, value the statistics of this city.
    statistics = {}
    for customer in Customer.all():
        if len(customer.app_ids) != 0:
            service_email = customer.service_email
            if customer.app_id not in statistics:
                stats = AssociationStatistic(key_name=customer.app_id)
                stats.generated_on = current_date
                statistics[customer.app_id] = stats
            else:
                stats = statistics[customer.app_id]
            if not service_email:
                logging.error(
                    u'Association customer %s(%d) has no service_email!',
                    customer.name, customer.id)
                continue
            stats.customer_emails.append(service_email)

            if service_email in broadcast_count_dict:
                stats.broadcasts_last_month.append(
                    broadcast_count_dict[customer.service_email])
            else:
                stats.broadcasts_last_month.append(0)

            if service_email in future_event_count_dict:
                stats.future_events_count.append(
                    future_event_count_dict[service_email])
            else:
                stats.future_events_count.append(0)

            if service_email in static_content_count_dict:
                stats.static_content_count.append(
                    static_content_count_dict[service_email])
            else:
                stats.static_content_count.append(0)

            if service_email in unanswered_question_count_dict:
                stats.last_unanswered_questions_timestamps.append(
                    unanswered_question_count_dict[service_email])
            else:
                stats.last_unanswered_questions_timestamps.append(0)

    for chunk in chunks(statistics.values(), 200):
        db.put(chunk)
Пример #6
0
def new_event_received(service_user, message_flow_run_id, member, steps,
                       end_id, end_message_flow_id, parent_message_key, tag,
                       result_key, flush_id, flush_message_flow_id,
                       service_identity, user_details):
    from solutions.common.bizz.messaging import _get_step_with_id

    logging.info("_flow_member_result_new_event: \n %s" % steps)

    calendar = _get_step_with_id(steps, 'message_calendar')

    title = _get_step_with_id(steps, 'message_title')
    if not title:
        logging.error(
            "Did not find step with id 'title'. Can not process message_flow_member_result with tag %s"
            % tag)
        return None

    date_ = _get_step_with_id(steps, 'message_date')
    if not date_:
        logging.error(
            "Did not find step with id 'date'. Can not process message_flow_member_result with tag %s"
            % tag)
        return None

    start_time = _get_step_with_id(steps, 'message_start_time')
    if not start_time:
        logging.error(
            "Did not find step with id 'start_time'. Can not process message_flow_member_result with tag %s"
            % tag)
        return None

    end_time = _get_step_with_id(steps, 'message_end_time')
    if not end_time:
        logging.error(
            "Did not find step with id 'end_time'. Can not process message_flow_member_result with tag %s"
            % tag)
        return None

    description = _get_step_with_id(steps, 'message_description')
    if not description:
        logging.error(
            "Did not find step with id 'description'. Can not process message_flow_member_result with tag %s"
            % tag)
        return None

    place = _get_step_with_id(steps, 'message_place')
    if not place:
        logging.error(
            "Did not find step with id 'place'. Can not process message_flow_member_result with tag %s"
            % tag)
        return None

    photo = _get_step_with_id(steps, 'message_photo')
    if not photo:
        logging.error(
            "Did not find step with id 'photo'. Can not process message_flow_member_result with tag %s"
            % tag)
        return None

    sln_settings = get_solution_settings(service_user)
    app_user = user_details[0].toAppUser()
    calendars_ids_admin = get_solution_calendar_ids_for_user(
        service_user, sln_settings.solution, app_user)

    if len(calendars_ids_admin) == 0:
        logging.warn("User %s isn't a calendar admin anymore" %
                     app_user.email())
        return None

    calendar_id = None
    if calendar and calendar.form_result.result:
        calendar_id = long(calendar.form_result.result.value)
    else:
        if sln_settings.default_calendar in calendars_ids_admin:
            calendar_id = sln_settings.default_calendar
        else:
            calendar_id = calendars_ids_admin[0]

    sc = SolutionCalendar.get_by_id(
        calendar_id, parent_key(service_user, sln_settings.solution))
    if not sc:
        logging.warn("Calendar %s does not exists anymore" % calendar_id)
        return None

    event = Event(parent=parent_key(service_user, sln_settings.solution))
    event.picture_version = 0
    event.title = title.form_result.result.value
    event.place = place.form_result.result.value
    event.description = description.form_result.result.value

    start_date = get_epoch_from_datetime(
        datetime.fromtimestamp(date_.form_result.result.value).date()
    ) + start_time.form_result.result.value
    event.last_start_date = start_date
    event.start_dates = [start_date]
    event.end_dates = [end_time.form_result.result.value]
    event.first_start_date = event.get_first_event_date()
    event.calendar_id = calendar_id
    if photo.form_result:
        result = urlfetch.fetch(photo.form_result.result.value, {},
                                "GET", {},
                                False,
                                False,
                                deadline=10 * 60)
        if result.status_code != 200:
            logging.error(
                "Failed to download photo upload for new event whith link: %s"
                % photo.form_result.result)
            picture = None
        else:
            img_str = result.content
            img_b64 = base64.b64encode(img_str)

            previous_len_img = len(img_b64)
            while len(img_b64) > 512 * 1024:
                img = images.Image(img_str)
                img.im_feeling_lucky()
                img_str = img.execute_transforms(
                    output_encoding=images.JPEG)  # Reduces quality to 85%
                img_b64 = base64.b64encode(img_str)

                if previous_len_img <= len(img_b64):
                    break
                previous_len_img = len(img_b64)

            picture = "data:image/jpg;base64,%s" % img_b64
    else:
        picture = None
    event.picture = picture
    event.put()

    send_message(service_user, u"solutions.common.calendar.update")
    deferred.defer(common_provision, service_user)
    return None
Пример #7
0
    def trans():
        if new_event.id:
            event = get_event_by_id(service_user, sln_settings.solution,
                                    new_event.id)
            if new_event.new_picture:
                event.picture_version += 1
        else:
            event = Event(
                parent=parent_key(service_user, sln_settings.solution))
            event.picture_version = 0

        event.title = new_event.title
        event.place = new_event.place
        event.organizer = new_event.organizer
        event.description = new_event.description
        start_dates = []
        for start_date in new_event.start_dates:
            start_dates.append(start_date.toEpoch())

        start_dates_sorted, end_dates_sorted = zip(
            *sorted(zip(start_dates, new_event.end_dates)))
        startDates = list(start_dates_sorted)
        new_event.end_dates = list(end_dates_sorted)

        event.last_start_date = max(startDates)
        event.start_dates = start_dates
        event.end_dates = new_event.end_dates
        event.first_start_date = event.get_first_event_date()
        event.url = new_event.external_link
        event.picture = picture
        event.calendar_id = new_event.calendar_id
        sln_settings.updates_pending = True
        put_and_invalidate_cache(event, sln_settings)
        return sln_settings
Пример #8
0
def _put_default_event(service_user, translate, solution):
    event = Event(parent=parent_key(service_user, solution))

    now = time.mktime(date.timetuple(date.today()))
    event.title = u"Title"
    event.place = u"Place"
    event.description = u"Description"
    event.last_start_date = long(now + 7 * 24 * 60 * 60 + 20 * 60 * 60)
    event.start_dates = [event.last_start_date]
    event.end_dates = [long(4 * 60 * 60)]
    event.first_start_date = event.get_first_event_date()

    event.put()
    event2 = Event(parent=parent_key(service_user, solution))
    event2.title = u"Title2"
    event2.place = u"Place2"
    event2.description = u"Description2"
    event2.last_start_date = long(now + 14 * 24 * 60 * 60 + 20 * 60 * 60)
    event2.start_dates = [event2.last_start_date]
    event2.end_dates = [long(4 * 60 * 60)]
    event2.first_start_date = event2.get_first_event_date()

    event2.put()
    return [event, event2]
Пример #9
0
def put_google_events(service_user, calendar_str_key, calendar_id, solution,
                      google_calendar_finished, google_events, language):
    to_put = []
    no_title_text = common_translate(language, SOLUTION_COMMON, '(No title)')
    for google_event in google_events:
        try:
            google_event_id = google_event["id"]
            event_parent_key = parent_key(service_user, solution)
            event = Event.all().ancestor(event_parent_key).filter(
                "source =",
                Event.SOURCE_GOOGLE_CALENDAR).filter("external_id =",
                                                     google_event_id).get()
            if not event:
                event = Event(parent=event_parent_key,
                              source=Event.SOURCE_GOOGLE_CALENDAR,
                              external_id=google_event_id)

            if google_event.get("status", "confirmed") == "cancelled":
                if not event.is_saved():
                    continue
                event.deleted = True
            elif not event.deleted:
                event.deleted = False
            event.title = google_event.get('summary', no_title_text)
            event.place = google_event.get("location",
                                           u"").replace(u"\n", u" ")
            event.organizer = google_event.get("organizer",
                                               {}).get("displayName", u"")
            event.description = google_event.get('description', u"")
            event.calendar_id = calendar_id
            event.external_link = google_event["htmlLink"]
            event.start_dates = list()
            event.end_dates = list()

            if google_event["start"].get("dateTime", None):
                start_date_with_tz = dateutil.parser.parse(
                    google_event["start"]["dateTime"])
                end_date_with_tz = dateutil.parser.parse(
                    google_event["end"]["dateTime"])

                day_difference = abs(
                    (end_date_with_tz - start_date_with_tz).days)
                if day_difference == 0:
                    start_epoch = get_epoch_from_datetime(
                        datetime(start_date_with_tz.year,
                                 start_date_with_tz.month,
                                 start_date_with_tz.day,
                                 start_date_with_tz.hour,
                                 start_date_with_tz.minute))
                    event.start_dates.append(start_epoch)
                    end_epoch = get_epoch_from_datetime(
                        datetime(end_date_with_tz.year, end_date_with_tz.month,
                                 end_date_with_tz.day, end_date_with_tz.hour,
                                 end_date_with_tz.minute))
                    end_date = datetime.fromtimestamp(end_epoch)
                    event.end_dates.append(
                        int(
                            timedelta(
                                hours=end_date.hour,
                                minutes=end_date.minute,
                                seconds=end_date.second).total_seconds()))


# TODO: multi day event
#                 else:
#                     start_date = datetime.strptime(google_event["start"]["date"], '%Y-%m-%d')
#                     end_date = datetime.strptime(google_event["end"]["date"], '%Y-%m-%d')
#                     day_difference = abs((end_date - start_date).days)

            if event.start_dates:
                event.first_start_date = event.start_dates[0]
                event.last_start_date = event.start_dates[-1]
                to_put.append(event)
            else:
                logging.info("Skipping event because it had no start_dates")
                logging.debug(google_event)
        except:
            logging.warn('Failed to put Google Event: %s', google_event)
            raise

    if to_put:
        db.put(to_put)

    if google_calendar_finished:

        def trans():
            scgs = SolutionCalendarGoogleSync.get_by_key_name(
                service_user.email())
            if not scgs:
                return True  # update was run from saving a calendar
            if calendar_str_key in scgs.google_calendar_keys:
                scgs.google_calendar_keys.remove(calendar_str_key)
                if not scgs.google_calendar_keys:
                    scgs.delete()
                    return True
                scgs.put()
                return False

        if db.run_in_transaction(trans):
            from solutions.common.bizz.provisioning import populate_identity_and_publish
            sln_settings = get_solution_settings(service_user)
            sln_main_branding = get_solution_main_branding(service_user)
            deferred.defer(populate_identity_and_publish, sln_settings,
                           sln_main_branding.branding_key)
Пример #10
0
def get_event_by_id(service_user, solution, id_):
    return Event.get_by_id(id_, parent_key(service_user, solution))
Пример #11
0
def get_public_event_list(service_user, solution):
    qry = Event.gql(
        "WHERE ANCESTOR IS :ancestor AND deleted=False AND source = :source")
    qry.bind(ancestor=parent_key(service_user, solution),
             source=Event.SOURCE_CMS)
    return generator(qry.run())
Пример #12
0
def get_event_list(service_user, solution):
    qry = Event.gql("WHERE ANCESTOR IS :ancestor AND deleted=False")
    qry.bind(ancestor=parent_key_unsafe(service_user, solution))
    return generator(qry.run())
Пример #13
0
 def trans():
     event = Event.get(event_key)
     event.first_start_date = event.get_first_event_date()
     event.put()