Example #1
0
    def test_case_serializable(self):
        # TODO >> With post processing FS
        f = os.path.join(RESOURCE_DIR, 'serialized_case.json')

        a = Case(file_number='ABC/123', date=date(year=2000, month=10, day=2))
        a_json = a.to_json(f)

        b = Case.from_json_file(f)
        b_json = b.to_json()

        self.assertEqual(a_json, b_json)
Example #2
0
    def test_field_validation(self):

        try:
            # max_length
            t = 'A' * 201
            c = Case(title=t, file_number=t)
            c.save()

            raise ValueError('DataError should have been raised.')
        except DataError:
            pass
Example #3
0
    def from_json_file(self, f):
        logger.debug('Test resource: %s' % f)

        case = Case.from_json_file(f)
        case.full_clean()
        case.save()

        self.assertGreaterEqual(len(case.text), 300,
                                'Case text is too short: %s' % case.text)

        logger.debug('Test OK: %s' % case)
Example #4
0
    def test_field_validation_2(self):

        try:
            # max_length
            t = 'A' * 201
            c = Case(title=t, file_number=t)
            c.full_clean()
            # c.save()

            raise ValueError('ValidationError should have been raised.')
        except ValidationError:
            pass
Example #5
0
    def test_raise_error_from_json_file(self):

        directory = os.path.join(RESOURCE_DIR, 'invalid_cases')
        for f in os.listdir(directory):
            f = os.path.join(directory, f)

            logger.debug('Test resource: %s' % f)

            try:
                Case.from_json_file(f)
                raise ValueError('ProcessingError not raised with %s' % f)
            except ProcessingError:
                pass
Example #6
0
    def test_assign_court(self):
        class TestCourtTypes(CourtTypes):
            def get_types(self):
                return {
                    'AG': {
                        'name': 'Amtsgericht',
                        'levels': [CourtLocationLevel.CITY]
                    },
                }

        with self.settings(COURT_TYPES=TestCourtTypes()):

            unprocessed = Case.objects.get(pk=1)

            self.assertEqual(Court.DEFAULT_ID, unprocessed.pk,
                             'Unprocessed case has already assigned court')

            case = AssignCourt().process(unprocessed)

            self.assertEqual(1166, case.court.pk, 'Invalid court id')
            self.assertEqual('EuGH', case.court.code, 'Invalid court code')

            with_city = AssignCourt().process(
                Case(court_id=Court.DEFAULT_ID,
                     file_number='with-city',
                     court_raw=json.dumps({
                         'name': 'Amtsgericht Aalen',
                     })))

            self.assertEqual(1173, with_city.court.pk, 'Invalid court id')

            #
            with_chamber = AssignCourt().process(
                Case(court_id=Court.DEFAULT_ID,
                     file_number='with-chamber',
                     court_raw=json.dumps({
                         'name':
                         'Bundesverfassungsgericht 5. Kammer',
                     })))

            self.assertEqual(1167, with_chamber.court.pk, 'Invalid court id')

            not_found = AssignCourt().process(
                Case(court_id=2,
                     file_number='with-chamber',
                     court_raw=json.dumps({
                         'name': 'Some other court',
                     })))

            self.assertEqual(Court.DEFAULT_ID, not_found.court_id,
                             'Invalid court id')
Example #7
0
def short_url_view(request, pk):
    """
    Redirects to detail view
    """
    item = get_object_or_404(Case.get_queryset(request).only('slug'), pk=pk)

    return redirect(item.get_absolute_url(), permanent=True)
Example #8
0
class CaseAnnotationSerializer(serializers.ModelSerializer):
    belongs_to = serializers.PrimaryKeyRelatedField(
        queryset=Case.get_queryset().defer(
            *Case.defer_fields_list_view).select_related('court'),
        html_cutoff=10,
    )
    label = serializers.PrimaryKeyRelatedField(
        queryset=AnnotationLabel.objects.all().select_related('owner'),
        html_cutoff=10,
    )

    class Meta:
        model = CaseAnnotation
        fields = '__all__'

    def validate(self, attrs):
        instance = self.Meta.model(**attrs)

        # Work-around to show fields in error response
        try:
            instance.clean()
        except ValidationError as e:
            raise serializers.ValidationError(e.args[0])

        return attrs
Example #9
0
def case_view(request, case_slug):
    """
    Case detail view
    """
    qs = Case.get_queryset(request).select_related('court').select_related(
        'source')
    item = get_object_or_404(qs, slug=case_slug)

    # Load annotations for staff users
    if request.user.is_staff:
        marker_labels = item.get_markers(request)\
            .values('label__id', 'label__name', 'label__color', 'label__private')\
            .annotate(count=Count('label'))\
            .order_by('count')
        annotation_labels = item.get_annotation_labels(request)
    else:
        marker_labels = None
        annotation_labels = None

    return render(
        request, 'cases/case.html', {
            'title': item.get_title(),
            'item': item,
            'content': item.get_content_as_html(request),
            'annotation_labels': annotation_labels,
            'marker_labels': marker_labels,
            'line_counter': Counter(),
            'nav': 'cases',
        })
Example #10
0
    def test_extract_law_and_case_refs_2(self):
        unprocessed = Case.from_json_file(
            os.path.join(RESOURCE_DIR, 'extract_refs/2.json'))
        case = ExtractRefs(law_refs=True, case_refs=True).process(unprocessed)

        # TODO Old validated value: 56
        self.assertEqual(62, len(case.reference_markers),
                         'Invalid number of references')
Example #11
0
    def test_extract_law_refs_1(self):
        unprocessed = Case.from_json_file(
            os.path.join(RESOURCE_DIR, 'extract_refs/1.json'))
        case = ExtractRefs(law_refs=True, case_refs=False).process(unprocessed)

        # TODO Validate test - old value: 33
        self.assertEqual(33, len(case.reference_markers),
                         'Invalid number of references')
Example #12
0
    def get_queryset(self):
        # Get cases that belong to court
        queryset = Case.get_queryset(self.request)\
            .select_related('court')\
            .defer(*Case.defer_fields_list_view)\
            .filter(court=self.court)\
            .order_by('-date')

        return queryset
Example #13
0
    def test_assign_court_umlauts(self):
        #
        case_with_umlauts = AssignCourt().process(
            Case(court_id=Court.DEFAULT_ID,
                 file_number='with-umlauts',
                 court_raw='{"name": "Europ\u00e4ischer Gerichtshof 9. Senat"}'
                 ))

        self.assertEqual(1166, case_with_umlauts.court_id)
Example #14
0
def index_view(request):

    law_books = LawBook.objects.filter(latest=True).order_by('-order')
    cases = Case.get_queryset(request)\
                .defer(*Case.defer_fields_list_view)\
                .select_related('court')\
                .order_by('-updated_date')

    laws_count = '{:,}'.format(Law.objects.all().count())
    cases_count = '{:,}'.format(Case.get_queryset(request).count())

    return render(request, 'homepage/index.html', {
        'title': _('Free Access to Legal Data'),
        'nav': 'homepage',
        'law_books': law_books,
        'cases': cases,
        'laws_count': laws_count,
        'cases_count': cases_count,
    })
Example #15
0
def case_view(request, case_slug):
    item = get_object_or_404(Case.get_queryset(request), slug=case_slug)

    return render(
        request, 'cases/case.html', {
            'title': item.get_title(),
            'item': item,
            'line_counter': Counter(),
            'nav': 'cases',
            'is_read_more': is_read_more
        })
Example #16
0
def case_view(request, case_slug):
    item = get_object_or_404(Case.get_queryset(request), slug=case_slug)

    return render(request, 'cases/case.html', {
        'title': item.get_title(),
        'item': item,
        'content': item.get_content_as_html(request),
        'annotation_labels': item.get_annotation_labels(request) if request.user.is_staff else None,
        'line_counter': Counter(),
        'nav': 'cases',
    })
Example #17
0
 def __init__(self):
     super().__init__(
         {
             'queryset':
             Case.get_queryset().select_related('court').defer(
                 *Case.defer_fields_list_view).order_by('-updated_date'),
             'date_field':
             'updated_date'
         },
         priority=1.0,
         changefreq='daily')
Example #18
0
    def test_assign_court(self):

        unprocessed = Case.objects.get(pk=1)

        self.assertEqual(Court.DEFAULT_ID, unprocessed.pk,
                         'Unprocessed case has already assigned court')

        case = AssignCourt().process(unprocessed)

        self.assertEqual(1166, case.court.pk, 'Invalid court id')
        self.assertEqual('EuGH', case.court.code, 'Invalid court code')

        with_city = AssignCourt().process(
            Case(court_id=Court.DEFAULT_ID,
                 file_number='with-city',
                 court_raw=json.dumps({
                     'name': 'Amtsgericht Aalen',
                 })))

        self.assertEqual(1173, with_city.court.pk, 'Invalid court id')

        #
        with_chamber = AssignCourt().process(
            Case(court_id=Court.DEFAULT_ID,
                 file_number='with-chamber',
                 court_raw=json.dumps({
                     'name':
                     'Bundesverfassungsgericht 5. Kammer',
                 })))

        self.assertEqual(1167, with_chamber.court.pk, 'Invalid court id')

        not_found = AssignCourt().process(
            Case(court_id=2,
                 file_number='with-chamber',
                 court_raw=json.dumps({
                     'name': 'Some other court',
                 })))

        self.assertEqual(Court.DEFAULT_ID, not_found.court_id,
                         'Invalid court id')
Example #19
0
def index_view(request):
    k = 10
    books = LawBook.objects.filter(latest=True).order_by('-revision_date')[:k]
    cases = Case.get_queryset(request).order_by('-updated_date')[:k]

    return render(
        request, 'homepage/index.html', {
            'title': _('Free Access to Legal Data'),
            'nav': 'homepage',
            'books': books,
            'cases': cases
        })
Example #20
0
def view_law(request, law_slug, book_slug):

    book = get_law_book(request, book_slug)
    item = get_object_or_404(Law.objects.select_related('book', 'previous'),
                             slug=law_slug,
                             book=book)

    referencing_cases = item.get_referencing_cases(
        Case.get_queryset(request).defer(*Case.defer_fields_list_view))

    return render(
        request, 'laws/law.html', {
            'nav': 'laws',
            'item': item,
            'title': item.get_title(),
            'referencing_cases': referencing_cases,
        })
Example #21
0
def index_view(request):
    items = Case.get_queryset(request).order_by('-date')

    paginator = Paginator(items, 50)  # 50 items per page
    page = request.GET.get('page')
    try:
        items = paginator.page(page)
    except PageNotAnInteger:
        items = paginator.page(1)
    except EmptyPage:
        items = paginator.page(paginator.num_pages)

    return render(request, 'cases/index.html', {
        'title': _('Cases'),
        'items': items,
        'nav': 'cases'
    })
Example #22
0
    def test_from_hit(self):
        search_hit = {
            'title': 'Case title',
            'slug': 'some-slug',
            'court': Court.DEFAULT_ID,
            'date': '2017-01-01',
            'file_number': 'AB/123',
            'type': 'Urteil',
            'source_url': 'http://openjur.de',
            'pdf_url': 'http://',
            'text': 'Some case text, lorem ipsum.'
        }
        c = Case.from_hit(search_hit)

        self.assertEqual(c.get_court().get_id(), Court.DEFAULT_ID,
                         'Invalid court id')
        self.assertEqual(c.file_number, 'AB/123', 'Invalid file number')
Example #23
0
    def test_extract_law_and_case_refs_3(
            self):  # TODO Requires more law book BauGB
        """
        Assert:

        (vgl. Schl.-Holst. OVG, Urteil vom 19.01.2012 - 1 LB 11/11 -, juris [Rn. 23 f.])
        (vgl. OVG NRW, Urteil vom 10.10.1996 - 7 A 4185/95 -, juris [Rn. 68])
        (vgl. BVerwG, Beschluss vom 12.11.1987 - 4 B 216/87 -, juris [Rn. 2]; VGH BW, Urteil vom 10.01.2007 - 3 S 1251/06 -, juris [Rn. 25])
        (so BVerfG in std. Rspr., vgl. z.B. BVerfG, Beschluss vom 23.07.2003 –- 2 BvR 624/01 -, juris [Rn. 16 f.])

        :return:
        """
        unprocessed = Case.from_json_file(
            os.path.join(RESOURCE_DIR, 'extract_refs/3.json'))
        case = ExtractRefs(law_refs=True, case_refs=True).process(unprocessed)

        self.assertEqual(5, len(case.reference_markers),
                         'Invalid number of references')
Example #24
0
    def test_assign_court_umlauts(self):
        class TestCourtTypes(CourtTypes):
            def get_types(self):
                return {
                    'EuGH': {
                        'name': 'Europäischer Gerichtshof',
                        'levels': []
                    }
                }

        with self.settings(COURT_TYPES=TestCourtTypes()):

            case_with_umlauts = AssignCourt().process(
                Case(court_id=Court.DEFAULT_ID,
                     file_number='with-umlauts',
                     court_raw=
                     '{"name": "Europ\u00e4ischer Gerichtshof 9. Senat"}'))

            self.assertEqual(1166, case_with_umlauts.court_id)
Example #25
0
    def test_case_serializable(self):
        # TODO >> With post processing FS
        file_path = os.path.join(settings.WORKING_DIR, 'serialized_case.json')
        a = Case(file_number='ABC/123', date=date(year=2000, month=10, day=2))
        a.save()
        a_json = a.to_json(file_path)

        b = Case.from_json_file(file_path)
        b_json = b.to_json()

        # Clean up again
        os.remove(file_path)

        # Compare
        self.assertEqual(a_json, b_json)
Example #26
0
class CaseViewSet(viewsets.ModelViewSet):
    """
    List view for cases
    """
    pagination_class = SmallResultsSetPagination  # limit page (other content field blows up response size)
    queryset = Case.get_queryset()
    serializer_class = CaseSerializer
    # lookup_field = 'slug'

    filter_backends = (OrderingFilter, DjangoFilterBackend, )
    filterset_class = CaseAPIFilter
    ordering_fields = ('date', )

    @method_decorator(cache_page(60))
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

    def get_queryset(self):
        return Case.get_queryset()\
            .select_related('court')\
            .only(*CASE_API_FIELDS)
Example #27
0
    def test_extract_case_refs_from_juris(self):
        fixtures = [
            {
                'file': '1.json',
                'ref_count': 8,  # TODO verify number
            },
            {
                'file': '2.json',
                'ref_count': 5,  # TODO verify number
            },
            {
                'file': '3.json',
                'ref_count': 5,  # Correct number
            }
        ]

        for f in fixtures:
            unprocessed = Case.from_json_file(
                os.path.join(RESOURCE_DIR, 'extract_refs/juris/' + f['file']))
            case = ExtractRefs(law_refs=False,
                               case_refs=True).process(unprocessed)

            self.assertEqual(f['ref_count'], len(case.reference_markers),
                             'Invalid number of references: %s' % f)
Example #28
0
class CasesModelsTestCase(TestCase):
    fixtures = [
        'locations/countries.json', 'locations/states.json',
        'locations/cities.json', 'courts/courts.json'
    ]

    def setUp(self):
        # CourtsTestCase.set_up_courts()
        pass

    def tearDown(self):
        # CourtsTestCase.tear_down_courts()
        pass

    def test_slug(self):
        Case.objects.create(pk=1,
                            file_number='AB/123',
                            slug='a-case-slug',
                            court_id=Court.DEFAULT_ID)

        self.assertEqual(
            Case.objects.get(slug='a-case-slug').pk, 1,
            'Cannot get case by slug')

    def test_field_validation_2(self):

        try:
            # max_length
            t = 'A' * 201
            c = Case(title=t, file_number=t)
            c.full_clean()
            # c.save()

            raise ValueError('ValidationError should have been raised.')
        except ValidationError:
            pass

    @mysql_only_test
    def test_field_validation(self):

        try:
            # max_length
            t = 'A' * 201
            c = Case(title=t, file_number=t)
            c.save()

            raise ValueError('DataError should have been raised.')
        except DataError:
            pass

    def from_json_directory(self, directory):
        """Test from_json_file method with different sources"""

        test_files = os.listdir(os.path.join(RESOURCE_DIR, directory))

        for f in test_files:
            f = os.path.join(RESOURCE_DIR, directory, f)
            self.from_json_file(f)

    def from_json_file(self, f):
        logger.debug('Test resource: %s' % f)

        case = Case.from_json_file(f)
        case.full_clean()
        case.save()

        self.assertGreaterEqual(len(case.text), 300,
                                'Case text is too short: %s' % case.text)

        logger.debug('Test OK: %s' % case)

    @skip  # TODO fixtures need to fit to test files
    def test_from_json_file_bgh(self):
        self.from_json_directory('from_bgh')

    @skip  # TODO write with django serializer
    def test_section_json(self):
        self.from_json_file(
            os.path.join(
                RESOURCE_DIR,
                'from_bverfg/bverfg_incorrect_string_value_in_raw.json'))

    # @skip  # TODO write with django serializer
    def test_raise_error_from_json_file(self):

        directory = os.path.join(RESOURCE_DIR, 'invalid_cases')
        for f in os.listdir(directory):
            f = os.path.join(directory, f)

            logger.debug('Test resource: %s' % f)

            try:
                Case.from_json_file(f)
                raise ValueError('ProcessingError not raised with %s' % f)
            except ProcessingError:
                pass

    def test_case_serializable(self):
        # TODO >> With post processing FS
        file_path = os.path.join(settings.WORKING_DIR, 'serialized_case.json')
        a = Case(file_number='ABC/123', date=date(year=2000, month=10, day=2))
        a.save()
        a_json = a.to_json(file_path)

        b = Case.from_json_file(file_path)
        b_json = b.to_json()

        # Clean up again
        os.remove(file_path)

        # Compare
        self.assertEqual(a_json, b_json)

        # case = Case.from_json_file(f)
        # self.assertEqual(open(f).read(), case.to_json(), 'JSON should be equal')
        # print(case.get_sections())

    def test_get_content_as_html(self):
        """Test valid HTML output."""
        expected = '<h1>Some html</h1><p>foo</p>'
        obj = Case(content=expected)
        self.assertEqual(obj.get_content_as_html(), expected,
                         'Invalid html conversation')

    def test_get_short_title(self):
        title = 'This is a very long title for an even more long cases to all extend'
        case = Case(title=title, file_number='ABC/123')

        self.assertEqual(13, len(case.get_short_title(10)), 'Invalid title')

    def test_get_absolute_url(self):
        case = Case(title='Some titlr', file_number='ABC/123')

        self.assertTrue('no-slug' in case.get_absolute_url(), 'Invalid url')

        case = Case(title='Some titlr', file_number='ABC/123', slug='abc')
        self.assertTrue('abc' in case.get_absolute_url(), 'Invalid url')
Example #29
0
    def test_get_short_title(self):
        title = 'This is a very long title for an even more long cases to all extend'
        case = Case(title=title, file_number='ABC/123')

        self.assertEqual(13, len(case.get_short_title(10)), 'Invalid title')
Example #30
0
 def test_get_content_as_html(self):
     """Test valid HTML output."""
     expected = '<h1>Some html</h1><p>foo</p>'
     obj = Case(content=expected)
     self.assertEqual(obj.get_content_as_html(), expected,
                      'Invalid html conversation')