#404 Support querying events with state names
Merged 4 years ago by jkaluza. Opened 4 years ago by qwan.

file modified
+16 -2
@@ -22,7 +22,8 @@ 

  from flask import request, url_for, jsonify

  

  from freshmaker import db

- from freshmaker.types import ArtifactType, ArtifactBuildState

+ from freshmaker.errors import ValidationError

+ from freshmaker.types import ArtifactType, ArtifactBuildState, EventState

  from freshmaker.models import ArtifactBuild, Event

  

  
@@ -154,7 +155,7 @@ 

  

      query = Event.query

  

-     for key in ['message_id', 'search_key', 'event_type_id', 'state']:

+     for key in ['message_id', 'search_key', 'event_type_id']:

          values = flask_request.args.getlist(key)

          if not values:

              continue
@@ -165,6 +166,19 @@ 

              search_attr = getattr(Event, key)

              query = query.filter(search_attr.in_(values))

  

+     states = flask_request.args.getlist("state")

+     search_states = []

+     for state in states:

+         if state.isdigit():

+             search_states.append(state)

+         else:

+             if state.upper() in [x.name for x in EventState]:

+                 search_states.append(EventState[state.upper()].value)

+             else:

+                 raise ValidationError("Invalid state was supplied: %s" % state)

+     if search_states:

+         query = query.filter(Event.state.in_(search_states))

+ 

      query = _order_by(flask_request, query, Event,

                        ["id", "message_id"], "-id")

  

file modified
+41
@@ -367,6 +367,47 @@ 

          self.assertEqual(len(evs), 1)

          self.assertEqual(evs[0]['search_key'], 'RHSA-2018-101')

  

+     def test_query_event_by_state_name(self):

+         models.Event.create(db.session,

+                             "2018-00000000-0000-0000-0123-000000000001",

+                             "0123001",

+                             events.MBSModuleStateChangeEvent,

+                             state=EventState['COMPLETE'].value)

+         resp = self.client.get('/api/1/events/?state=complete')

+         evs = json.loads(resp.get_data(as_text=True))['items']

+         self.assertEqual(len(evs), 1)

+         self.assertEqual(evs[0]['state'], EventState['COMPLETE'].value)

+ 

+     def test_query_event_with_invalid_state_name(self):

+         resp = self.client.get('/api/1/events/?state=invalid')

+         data = json.loads(resp.get_data(as_text=True))

+         self.assertEqual(data['status'], 400)

+         self.assertEqual(data['message'], "Invalid state was supplied: invalid")

+ 

+     def test_query_event_by_multiple_state_names(self):

+         models.Event.create(db.session,

+                             "2018-00000000-0000-0000-0123-000000000001",

+                             "0123001",

+                             events.MBSModuleStateChangeEvent,

+                             state=EventState['BUILDING'].value)

+         models.Event.create(db.session,

+                             "2018-00000000-0000-0000-0123-000000000002",

+                             "0123002",

+                             events.MBSModuleStateChangeEvent,

+                             state=EventState['COMPLETE'].value)

+         models.Event.create(db.session,

+                             "2018-00000000-0000-0000-0123-000000000003",

+                             "0123003",

+                             events.MBSModuleStateChangeEvent,

+                             state=EventState['COMPLETE'].value)

+         resp = self.client.get('/api/1/events/?state=building&state=complete')

+         evs = json.loads(resp.get_data(as_text=True))['items']

+         self.assertEqual(len(evs), 3)

+         building_events = [e for e in evs if e['state'] == EventState['BUILDING'].value]

+         complete_events = [e for e in evs if e['state'] == EventState['COMPLETE'].value]

+         self.assertEqual(len(building_events), 1)

+         self.assertEqual(len(complete_events), 2)

+ 

      def test_query_event_order_by_default(self):

          resp = self.client.get('/api/1/events/')

          evs = json.loads(resp.get_data(as_text=True))['items']

With this change, we can query events with state names, like:

/api/1/events/?state=ready
/api/1/events/?state=done&state=ready

rebased onto 12e44e1bc9847063589dd70a027be08106b19e44

4 years ago

rebased onto 995abd4cc9228d85450f884ceebf468269a938a0

4 years ago

Actually, you need to use freshmaker.types.EventState to map state name to number. the MBS.BUILD_STATES is dict with Module Build Service build states, but here you are filtering freshmaker.models.Event.

rebased onto 6d0fcdae815f96af9769c962c9e196c479dc6c83

4 years ago

oops, thanks for pointing it out, fixed and rebased.

rebased onto a6362edeb92153301192f97a56cb3e3de888e511

4 years ago

rebased onto 370034c

4 years ago

Pull-Request has been merged by jkaluza

4 years ago