예제 #1
0
def test_past_disruption_2_periods():
    '''
        application_period  2014-02-10  2014-03-10
        application_period  2014-03-12  2014-03-15
        current date                                2014-03-16
        disruption.status   past
    '''
    disruption = models.Disruption()
    disruption.start_publication_date = datetime(2014, 2, 10, 13, 5, 10)
    disruption.end_publication_date = datetime(2014, 3, 16, 13, 5, 10)

    impact = models.Impact()
    application_period = models.ApplicationPeriods()
    application_period.start_date = datetime(2014, 2, 10, 13, 5, 10)
    application_period.end_date = datetime(2014, 3, 10, 13, 5, 10)
    impact.application_periods.append(application_period)

    application_period = models.ApplicationPeriods()
    application_period.start_date = datetime(2014, 3, 12, 13, 5, 10)
    application_period.end_date = datetime(2014, 3, 15, 13, 5, 10)
    impact.application_periods.append(application_period)

    disruption.impacts.append(impact)
    impact.disruption = disruption
    with app.app_context():
        g.current_time = datetime(2014, 3, 16, 13, 5, 10)
        class_time = fields.ComputeDisruptionStatus(Obj())
        eq_(class_time.output(None, impact), 'past')
예제 #2
0
def test_field_cause():
    obj = Obj()
    obj.disruption = models.Disruption()
    cause = models.Cause()
    obj.disruption.cause = cause
    class_field_cause = fields.FieldCause(Obj())
    eq_(class_field_cause.output(None, obj), cause.wording)
예제 #3
0
def test_disruption_with_draft_status_isnnot_send():
    '''
    Tests that a disruption with status draft is not sent to navitia
    :return:
    '''
    disruption = models.Disruption()
    disruption.status = 'draft'
    has_been_sent = send_disruption_to_navitia(disruption)

    eq_(has_been_sent, False)
예제 #4
0
def test_field_cause_none():
    obj = Obj()
    obj.disruption = models.Disruption()
    cause = models.Cause()
    wording = models.Wording()
    wording.key = 'external_long'
    wording.value = 'external medium'
    cause.wordings.append(wording)
    obj.disruption.cause = cause
    class_field_cause = fields.FieldCause(Obj())
    eq_(class_field_cause.output(None, obj), None)
예제 #5
0
def test_disruption_with_archived_status_is_sent():
    '''
    Tests that a disruption with status archived is sent to navitia
    :return:
    '''
    disruption = models.Disruption()

    disruption.contributor = models.Contributor()
    disruption.contributor_id = disruption.contributor.id

    disruption.status = 'archived'
    has_been_sent = send_disruption_to_navitia(disruption)

    eq_(has_been_sent, None)
예제 #6
0
def test_disruption_with_rabbitmq_exception():
    '''
    Tests when a disruption fail to publish to rabbitmq
    :return:
    '''
    disruption = models.Disruption()

    #contributor
    disruption.contributor = models.Contributor()
    disruption.contributor_id = disruption.contributor.id

    #cause
    disruption.cause = models.Cause()
    disruption.cause.wording = "CauseTest"
    disruption.cause.category = models.Category()
    disruption.cause.category.name = "CategoryTest"
    disruption.reference = "DisruptionTest"

    #localization
    localization = models.PTobject()
    localization.uri = "stop_area:123"
    localization.type = "stop_area"
    disruption.localizations.append(localization)

    # Wording
    wording = models.Wording()
    wording.key = "key_1"
    wording.value = "value_1"
    disruption.cause.wordings.append(wording)
    wording = models.Wording()
    wording.key = "key_2"
    wording.value = "value_2"
    disruption.cause.wordings.append(wording)

    # Tag
    tag = models.Tag()
    tag.name = "rer"
    disruption.tags.append(tag)

    disruption.status = 'published'

    chaos.publisher.publish = MagicMock(return_value=False)
    to_rabbitmq_not_sent = send_disruption_to_navitia(disruption)
    eq_(to_rabbitmq_not_sent, False)
예제 #7
0
def test_disruption_with_published_status_is_sent():
    '''
    Tests that a disruption with status published is sent to navitia
    :return:
    '''
    disruption = models.Disruption()

    #contributor
    disruption.contributor = models.Contributor()
    disruption.contributor_id = disruption.contributor.id

    #cause
    disruption.cause = models.Cause()
    disruption.cause.wording = "CauseTest"
    disruption.cause.category = models.Category()
    disruption.cause.category.name = "CategoryTest"
    disruption.reference = "DisruptionTest"

    #localization
    localization = models.PTobject()
    localization.uri = "stop_area:123"
    localization.type = "stop_area"
    disruption.localizations.append(localization)

    # Wording
    wording = models.Wording()
    wording.key = "key_1"
    wording.value = "value_1"
    disruption.cause.wordings.append(wording)
    wording = models.Wording()
    wording.key = "key_2"
    wording.value = "value_2"
    disruption.cause.wordings.append(wording)

    # Tag
    tag = models.Tag()
    tag.name = "rer"
    disruption.tags.append(tag)

    disruption.status = 'published'
    has_been_sent = send_disruption_to_navitia(disruption)

    eq_(has_been_sent, None)
예제 #8
0
파일: history.py 프로젝트: azime/Chaos-1
def create_disruption_from_json(json):
    disruption = models.Disruption()
    disruption.id = json['id']
    disruption.reference = json['reference']
    disruption.note = json['note']
    disruption.status = json['status']
    disruption.version = json['version']
    disruption.created_at = get_datetime_from_json_attr(json, 'created_at')
    disruption.updated_at = get_datetime_from_json_attr(json, 'updated_at')
    disruption.start_publication_date = get_datetime_from_json_attr(
        json['publication_period'], 'begin')
    disruption.end_publication_date = get_datetime_from_json_attr(
        json['publication_period'], 'end')
    disruption.publicationStatus = json['publication_status']
    disruption.history_localization = json['localization']
    disruption.contributor = create_contributor_from_json(json['contributor'])
    disruption.cause = create_cause_from_json(json['cause'])
    disruption.tags = create_tags_from_json(json['tags'])
    disruption.properties = create_properties_from_json(
        json['properties'], json['id'])
    disruption.impacts = create_impacts_from_json(json['impacts'], json['id'])
    disruption.author = get_author_from_json(json)

    return disruption
예제 #9
0
파일: resources.py 프로젝트: nberard/Chaos
class Disruptions(flask_restful.Resource):
    def __init__(self):
        self.navitia = None
        self.parsers = {}
        self.parsers["get"] = reqparse.RequestParser()
        parser_get = self.parsers["get"]

        parser_get.add_argument("start_page", type=int, default=1)
        parser_get.add_argument("items_per_page", type=int, default=20)
        parser_get.add_argument("publication_status[]",
                                type=option_value(publication_status_values),
                                action="append",
                                default=publication_status_values)
        parser_get.add_argument("tag[]", type=utils.get_uuid, action="append")
        parser_get.add_argument("current_time", type=utils.get_datetime)
        parser_get.add_argument("uri", type=str)
        parser_get.add_argument("status[]",
                                type=option_value(disruption_status_values),
                                action="append",
                                default=disruption_status_values)

    @validate_navitia()
    @validate_contributor()
    @manage_navitia_error()
    @validate_id()
    def get(self, contributor, navitia, id=None):
        self.navitia = navitia
        if id:
            return marshal(
                {'disruption': models.Disruption.get(id, contributor.id)},
                one_disruption_fields)
        else:
            args = self.parsers['get'].parse_args()
            page_index = args['start_page']
            if page_index == 0:
                abort(400, message="page_index argument value is not valid")
            items_per_page = args['items_per_page']
            if items_per_page == 0:
                abort(400,
                      message="items_per_page argument value is not valid")
            publication_status = args['publication_status[]']
            tags = args['tag[]']
            uri = args['uri']
            statuses = args['status[]']

            g.current_time = args['current_time']
            result = models.Disruption.all_with_filter(
                page_index=page_index,
                items_per_page=items_per_page,
                contributor_id=contributor.id,
                publication_status=publication_status,
                tags=tags,
                uri=uri,
                statuses=statuses)
            response = {
                'disruptions': result.items,
                'meta': make_pager(result, 'disruption')
            }
            return marshal(response, disruptions_fields)

    @validate_navitia()
    @validate_client(True)
    @manage_navitia_error()
    def post(self, client, navitia):
        self.navitia = navitia
        json = request.get_json(silent=True)
        logging.getLogger(__name__).debug('POST disruption: %s', json)
        try:
            validate(json, disruptions_input_format)
        except ValidationError, e:
            logging.debug(str(e))
            # TODO: generate good error messages
            return marshal({'error': {
                'message': utils.parse_error(e)
            }}, error_fields), 400
        disruption = models.Disruption()
        mapper.fill_from_json(disruption, json, mapper.disruption_mapping)

        # Use contributor_code present in the json to get contributor_id
        if 'contributor' in json:
            disruption.contributor = models.Contributor.get_or_create(
                json['contributor'])
        disruption.client = client

        # Add localization present in Json
        try:
            db_helper.manage_pt_object_without_line_section(
                self.navitia, disruption.localizations, 'localization', json)
        except exceptions.ObjectUnknown, e:
            return marshal({'error': {
                'message': '{}'.format(e.message)
            }}, error_fields), 404
예제 #10
0
class Disruptions(flask_restful.Resource):
    def __init__(self):
        self.navitia = None
        self.parsers = {}
        self.parsers["get"] = reqparse.RequestParser()
        parser_get = self.parsers["get"]

        parser_get.add_argument("start_page", type=int, default=1)
        parser_get.add_argument("items_per_page", type=int, default=20)
        parser_get.add_argument("publication_status[]",
                                type=option_value(publication_status_values),
                                action="append",
                                default=publication_status_values)
        parser_get.add_argument("ends_after_date", type=utils.get_datetime),
        parser_get.add_argument("ends_before_date", type=utils.get_datetime),
        parser_get.add_argument("tag[]", type=utils.get_uuid, action="append")
        parser_get.add_argument("current_time", type=utils.get_datetime)
        parser_get.add_argument("uri", type=str)
        parser_get.add_argument("line_section",
                                type=types.boolean,
                                default=False)
        parser_get.add_argument("status[]",
                                type=option_value(disruption_status_values),
                                action="append",
                                default=disruption_status_values)
        parser_get.add_argument("depth", type=int, default=1)

    @validate_navitia()
    @validate_contributor()
    @manage_navitia_error()
    @validate_id()
    def get(self, contributor, navitia, id=None):
        self.navitia = navitia
        args = self.parsers['get'].parse_args()
        depth = args['depth']
        g.display_impacts = depth > 1

        if id:
            return self._get_disruption_by_id(id, contributor.id)
        else:
            return self._get_disruptions(contributor.id, args)

    def _get_disruption_by_id(self, id, contributor_id):
        return marshal(
            {'disruption': models.Disruption.get(id, contributor_id)},
            one_disruption_fields)

    def _get_disruptions(self, contributor_id, args):

        self._validate_arguments_for_disruption_list(args)
        g.current_time = args['current_time']
        page_index = args['start_page']
        items_per_page = args['items_per_page']
        publication_status = args['publication_status[]']
        ends_after_date = args['ends_after_date']
        ends_before_date = args['ends_before_date']
        tags = args['tag[]']
        uri = args['uri']
        line_section = args['line_section']
        statuses = args['status[]']

        result = models.Disruption.all_with_filter(
            page_index=page_index,
            items_per_page=items_per_page,
            contributor_id=contributor_id,
            publication_status=publication_status,
            ends_after_date=ends_after_date,
            ends_before_date=ends_before_date,
            tags=tags,
            uri=uri,
            line_section=line_section,
            statuses=statuses)

        response = {
            'disruptions': result.items,
            'meta': make_pager(result, 'disruption')
        }
        '''
        The purpose is to remove any database-loaded state from all current objects so that the next access of
        any attribute, or any query execution, will retrieve new state, freshening those objects which are still
        referenced outside of the session with the most recent available state.
        '''
        for o in result.items:
            models.db.session.expunge(o)
        return marshal(response, disruptions_fields)

    def _validate_arguments_for_disruption_list(self, args):
        if args['start_page'] == 0:
            abort(400, message="page_index argument value is not valid")

        if args['items_per_page'] == 0:
            abort(400, message="items_per_page argument value is not valid")

    def get_post_error_response_and_log(self, exception, status_code):
        return self.get_error_response_and_log('POST', exception, status_code)

    def get_put_error_response_and_log(self, exception, status_code):
        return self.get_error_response_and_log('PUT', exception, status_code)

    def get_error_response_and_log(self, method, exception, status_code):
        response_content = marshal(
            {'error': {
                'message': '{}'.format(exception.message)
            }}, error_fields)
        logging.getLogger(__name__).debug(
            "\nError REQUEST %s disruption: [X-Customer-Id:%s;X-Coverage:%s;X-Contributors:%s;Authorization:%s] with payload \n%s"
            + "\ngot RESPONSE with status %d:\n%s", method,
            request.headers.get('X-Customer-Id'),
            request.headers.get('X-Coverage'),
            request.headers.get('X-Contributors'),
            request.headers.get('Authorization'),
            json.dumps(request.get_json(silent=True)), status_code,
            json.dumps(response_content))
        return response_content

    @validate_navitia()
    @validate_client(True)
    @manage_navitia_error()
    def post(self, client, navitia):
        self.navitia = navitia
        json = request.get_json(silent=True)

        try:
            validate(json, disruptions_input_format)
        except ValidationError, e:
            response = self.get_post_error_response_and_log(e, 400)
            return response, 400
        disruption = models.Disruption()
        mapper.fill_from_json(disruption, json, mapper.disruption_mapping)

        # Use contributor_code present in the json to get contributor_id
        if 'contributor' in json:
            disruption.contributor = models.Contributor.get_or_create(
                json['contributor'])
        disruption.client = client

        # Add localization present in Json
        try:
            db_helper.manage_pt_object_without_line_section(
                self.navitia, disruption.localizations, 'localization', json)
        except exceptions.ObjectUnknown, e:
            response = self.get_post_error_response_and_log(e, 404)
            return response, 404
예제 #11
0
def test_name_disruption():
    disruption = models.Disruption()
    eq_(str(disruption), "<Disruption '{}'>".format(disruption.id))