def test_date_check(self):
        data = FIXTURES['sitting_245_1']
        dt = datetime.datetime(2015, 5, 14, 15, 4, 3)
        title = (
            'Kūno kultūros ir sporto įstatymo Nr. I-1151 41 straipsnio '
            'pakeitimo įstatymo projektas Nr. XIIP-2468(2) (svarstymas ir '
            'priėmimas)')

        votings = [
            models.Voting().update_from_item(
                dict(data, _id='a', datetime='2015-05-14 15:00:00')),
            models.Voting().update_from_item(
                dict(data, _id='b', datetime='2015-05-14 15:30:00')),
            models.Voting().update_from_item(
                dict(data, _id='c', datetime='2015-05-14 14:00:00')),
        ]
        docs = stenogram_helpers.get_voting_for_stenogram(votings, title, dt)
        ids = [d.key for d in docs]
        self.assertEqual(ids, ['a', 'b'])

        votings = [
            models.Voting().update_from_item(
                dict(data, _id='a', datetime='2015-05-14 13:00:00')),
            models.Voting().update_from_item(
                dict(data, _id='b', datetime='2015-05-14 15:10:00')),
            models.Voting().update_from_item(
                dict(data, _id='c', datetime='2015-05-14 14:00:00')),
        ]
        docs = stenogram_helpers.get_voting_for_stenogram(votings, title, dt)
        ids = [d.key for d in docs]
        self.assertEqual(ids, ['b'])
 def test_single_documents(self):
     votings = [
         models.Voting().update_from_item(FIXTURES['sitting_245_1']),
         models.Voting().update_from_item(FIXTURES['sitting_245_2']),
     ]
     dt = datetime.datetime(2015, 5, 14, 15, 4, 3)
     title = (
         'Kūno kultūros ir sporto įstatymo Nr. I-1151 41 straipsnio '
         'pakeitimo įstatymo projektas Nr. XIIP-2468(2) (svarstymas ir '
         'priėmimas)')
     docs = stenogram_helpers.get_voting_for_stenogram(votings, title, dt)
     ids = [d.key for d in docs]
     self.assertEqual(ids, ['000oz6'])
    def test_get_votings_by_date(self):
        save_item(FIXTURES['sitting_245_1'])
        save_item(FIXTURES['sitting_245_2'])
        docs = stenogram_helpers.get_votings_by_date(datetime.date(
            2015, 5, 14))
        ids = [d.key for d in docs]
        self.assertEqual(ids, ['000oz6', '000oz7'])

        dt = datetime.datetime(2015, 5, 14, 15, 4, 3)
        title = (
            'Kūno kultūros ir sporto įstatymo Nr. I-1151 41 straipsnio '
            'pakeitimo įstatymo projektas Nr. XIIP-2468(2) (svarstymas ir '
            'priėmimas)')
        docs = stenogram_helpers.get_voting_for_stenogram(docs, title, dt)
        ids = [d.key for d in docs]
        self.assertEqual(ids, ['000oz6'])
 def test_many_documents(self):
     votings = [
         models.Voting().update_from_item(FIXTURES['sitting_245_1']),
         models.Voting().update_from_item(FIXTURES['sitting_245_2']),
     ]
     dt = datetime.datetime(2015, 5, 14, 15, 51, 20)
     title = (
         'Seimo nutarimo „Dėl teismų reorganizavimo“ projektas Nr. '
         'XIIP-3010, Teismų reorganizavimo įstatymo projektas Nr. '
         'XIIP-3011, Teismų įstatymo Nr. I-480 14, 28, 34, 36, 41, 45, '
         '55 1 , 56, 63, 65, 70, 80, 101, 107, 114, 120 straipsnių, '
         'trečiojo skirsnio pavadinimo pakeitimo ir Įstatymo papildymo '
         '114 1 straipsniu įstatymo projektas Nr. XIIP-3012, Apylinkių '
         'teismų įsteigimo įstatymo Nr. I-2375 pakeitimo įstatymo '
         'projektas Nr. XIIP-3013, Į statymo „Dėl Lietuvos Aukščiausiojo '
         'Teismo, Lietuvos apeliacinio teismo, apygardų teismų įsteigimo, '
         'apygardų ir apylinkių teismų veiklos teritorijų nustatymo bei '
         'Lietuvos Respublikos prokuratūros reformavimo“ Nr. I-497 '
         'pavadinimo ir 6 straipsnio pakeitimo bei 7 straipsnio '
         'pripažinimo netekusiu galios įstatymo projektas Nr. XIIP-3014, '
         'Administracinių teismų įsteigimo įstatymo Nr. VIII-1030 2 '
         'straipsnio pakeitimo ir 3 straipsnio pripažinimo netekusiu '
         'galios įstatymo projektas Nr. XIIP-3015, Civilinio proceso '
         'kodekso 34, 62, 111, 130, 134, 154, 220 1 , 220 2 , 258, 268, '
         '269, 325 ir 590 straipsnių pakeitimo įstatymo projektas Nr. '
         'XIIP-3016, Administracinių bylų teisenos įstatymo Nr. VIII-1029 '
         '17, 34, 35, 46, 64, 69, 70, 78, 73, 74, 85 ir 139 straipsnių '
         'pakeitimo įstatymo projektas Nr. XIIP-3017, Baudžiamojo proceso '
         'kodekso 40, 59, 60, 123, 124 ir 221 straipsnių pakeitimo ir '
         'Kodekso papildymo 11 1 straipsniu įstatymo projektas Nr. '
         'XIIP-3018, Administracinių teisės pažeidimų kodekso 21, 29, '
         '29 1 , 37, 216, 217, 224, 255, 261, 271, 282, 288, 292, 300, '
         '302 4 , 302 9 , 314, 337 ir 338 1 straipsnių pakeitimo įstatymo '
         'projektas Nr. XIIP-3019, Antstolių įstatymo Nr. IX-876 20 ir 26 '
         'straipsnių pakeitimo įstatymo projektas Nr. XIIP-3020 '
         '( pateikimas )')
     docs = stenogram_helpers.get_voting_for_stenogram(votings, title, dt)
     ids = [d.key for d in docs]
     self.assertEqual(ids, ['000oz7'])
    def process_stenogram_topic(self, item, spider):
        source_url = item['source']['url']

        stenogram, created = Stenogram.objects.get_or_create(
            source_id=item['_id'],
            defaults={
                'date': item['date'],
                'sitting_no': item['sitting_no'],
                'sitting_name': item.get('sitting_name'),
                'session': item.get('session'),
                'source': source_url,
            }
        )
        if not created and not stenogram.session and item.get('session'):
            stenogram.session = item['session']
            stenogram.save()

        # TODO: need a robust mechanism to uniquely identify topics
        # inside a stenogam. Or maybe just drop it entirely
        topic, created = StenogramTopicModel.objects.get_or_create(
            stenogram=stenogram,
            title=item['title'],
            defaults={
                'source': source_url,
                'timestamp': item['date'],
            }
        )

        if not created:
            topic.votings.all().delete()

        # Find voting for this stenogram topic
        votings = get_votings_by_date(item['date'].date())
        docs = get_voting_for_stenogram(votings, item['title'], item['date'])

        presenter_names = set()
        for doc in docs:
            for document in doc.value.get('documents', []):
                for speaker in document.get('speakers', []):
                    presenter_names.add(speaker['name'])
            Voting.objects.create(stenogram_topic=topic, voting=doc, timestamp=doc.timestamp)
        presenters = filter(bool,
                            map(self.mp_matcher.get_mp_by_name,
                                list(presenter_names)))
        topic.presenters = presenters
        topic.save()

        # Recreate all the statements since we can't reliably
        # identify statements in the database now
        topic.statements.all().delete()
        for statement in item['statements']:
            speaker = self.mp_matcher.get_mp_by_name(statement['speaker'])
            text = u' '.join(statement['statement'])
            statement = StenogramStatement(
                topic=topic,
                speaker=speaker,
                speaker_name=statement['speaker'],
                text=text,
                source=source_url,
                as_chairperson=statement['as_chair'],
                word_count=words_utils.get_word_count(text)
            )
            statement.save()

        return item