Beispiel #1
0
 def dimensions(self, request, system_name):
     """
     List Dimensions of a UnitSystem
     """
     key = request.GET.get('key')
     language = validate_language(
         request.GET.get('language', request.LANGUAGE_CODE))
     ordering = request.GET.get('ordering', 'name')
     descending = False
     if ordering and ordering[0] == '-':
         ordering = ordering[1:]
         descending = True
     if ordering not in ['code', 'name']:
         ordering = 'name'
     try:
         if request.user and request.user.is_authenticated:
             us = UnitSystem(system_name=system_name,
                             user=request.user,
                             key=key,
                             fmt_locale=language)
         else:
             us = UnitSystem(system_name=system_name, fmt_locale=language)
         serializer = DimensionSerializer(sorted(
             us.available_dimensions().values(),
             key=lambda x: getattr(x, ordering),
             reverse=descending),
                                          many=True,
                                          context={'request': request})
         return Response(serializer.data, content_type="application/json")
     except UnitSystemNotFound as e:
         return Response("Unknown unit system: " + str(e),
                         status=HTTP_404_NOT_FOUND)
Beispiel #2
0
 def list(self, request: HttpRequest, system_name: str):
     """
     List Units, ordered, filtered by key or dimension,
     translated in language
     """
     language = validate_language(
         request.GET.get('language', request.LANGUAGE_CODE))
     ordering = request.GET.get('ordering', 'name')
     descending = False
     if ordering and ordering[0] == '-':
         ordering = ordering[1:]
         descending = True
     if ordering not in ['code', 'name']:
         ordering = 'name'
     try:
         key = request.GET.get('key', None)
         user = request.user if \
             hasattr(request, 'user') and \
             request.user.is_authenticated else None
         us = UnitSystem(system_name=system_name,
                         fmt_locale=language,
                         user=user,
                         key=key)
         units = []
         dimension_param = request.GET.get(key='dimension')
         domain_param = request.GET.get(key='domain')
         if dimension_param:
             try:
                 dimension = Dimension(unit_system=us, code=dimension_param)
                 units = dimension.units
             except (DimensionNotFound, UnitNotFound) as e:
                 return Response(f'Invalid dimension filter: {str(e)}',
                                 status=status.HTTP_400_BAD_REQUEST)
         else:
             available_units = us.available_unit_names()
             if available_units:
                 units = [
                     us.unit(unit_name=unit_name)
                     for unit_name in available_units
                 ]
         if domain_param:
             units = [
                 u for u in units
                 if u.code in PHYSICS_DOMAINS.get(domain_param, [])
             ]
         units = sorted(units,
                        key=lambda x: getattr(x, ordering),
                        reverse=descending)
         serializer = UnitSerializer(units,
                                     many=True,
                                     context={'request': request})
         return Response(serializer.data)
     except UnitSystemNotFound as e:
         return Response(f'Invalid Unit System: {str(e)}',
                         status=status.HTTP_404_NOT_FOUND)
Beispiel #3
0
 def retrieve(self, request, system_name):
     """
     Retrieve UnitSystem
     """
     language = validate_language(
         request.GET.get('language', request.LANGUAGE_CODE))
     try:
         us = UnitSystem(system_name=system_name, fmt_locale=language)
         serializer = UnitSystemSerializer(us, context={'request': request})
         return Response(serializer.data, content_type="application/json")
     except UnitSystemNotFound as e:
         return Response("Unknown unit system: " + str(e),
                         status=HTTP_404_NOT_FOUND)
Beispiel #4
0
 def reverse_geocode(self, request):
     """
     Find country by reverse geocoding (giving latitude and longitude)
     """
     if 'geocoding' not in getattr(settings, 'SERVICES'):
         return Response("Geocoding service not configured",
                         status=status.HTTP_412_PRECONDITION_FAILED)
     if not request.GET.get('geocoder', 'google') in \
            settings.SERVICES['geocoding']:
         return Response("Geocoder not found",
                         status=status.HTTP_404_NOT_FOUND)
     language = validate_language(
         request.GET.get('language', request.LANGUAGE_CODE))
     geocoder = service(service_type='geocoding',
                        service_name=request.GET.get(
                            'geocoder', settings.GEOCODING_SERVICE))
     try:
         data = geocoder.reverse(lat=request.GET.get('latitude'),
                                 lng=request.GET.get('longitude'),
                                 key=request.GET.get(
                                     'geocoder_api_key',
                                     settings.GEOCODER_GOOGLE_KEY),
                                 language=language)
     except TypeError as e:
         logging.error("Invalid parameters")
         logging.error(e)
         return Response(str(e), status=status.HTTP_400_BAD_REQUEST)
     except json.JSONDecodeError as e:
         logging.error("Invalid response")
         logging.error(e)
         return Response(str(e), status=status.HTTP_400_BAD_REQUEST)
     except ValueError as e:
         logging.error("Invalid API configuration")
         logging.error(e)
         return Response(str(e), status=status.HTTP_400_BAD_REQUEST)
     except IOError as e:
         logging.error("Invalid request")
         logging.error(e)
         return Response(str(e), status=status.HTTP_400_BAD_REQUEST)
     except GeocoderRequestError as e:
         return Response(str(e), status=status.HTTP_400_BAD_REQUEST)
     addresses = geocoder.addresses(data)
     serializer = AddressSerializer(addresses,
                                    many=True,
                                    context={'request': request})
     return Response(serializer.data)
Beispiel #5
0
 def list(self, request):
     """
     List UnitSystems
     """
     ordering = request.GET.get('ordering', 'system_name')
     descending = False
     if ordering and ordering[0] == '-':
         ordering = ordering[1:]
         descending = True
     if ordering not in ['system_name']:
         ordering = 'system_name'
     language = validate_language(
         request.GET.get('language', request.LANGUAGE_CODE))
     us = UnitSystem(fmt_locale=language)
     us = [{
         'system_name': s
     } for s in sorted(us.available_systems(), reverse=descending)]
     return Response(us, content_type="application/json")
Beispiel #6
0
 def get_translated_name(self, obj: Country) -> str:
     """
     Country translation wrapper
     :param obj: Country
     """
     request = self.context.get('request', None)
     if request:
         try:
             language = validate_language(
                 request.GET.get('language', request.LANGUAGE_CODE))
             translation = gettext.translation('iso3166',
                                               pycountry.LOCALES_DIR,
                                               languages=[language])
             translation.install()
             return translation.gettext(obj.name)
         except FileNotFoundError:
             return obj.name
     else:
         return obj.name
Beispiel #7
0
 def retrieve(self, request: HttpRequest, system_name: str, unit_name: str):
     """
     Get unit information for unit in unit system
     """
     language = validate_language(
         request.GET.get('language', request.LANGUAGE_CODE))
     try:
         key = request.GET.get('key', None)
         user = request.user if \
             hasattr(request, 'user') and \
             request.user.is_authenticated else None
         us = UnitSystem(system_name=system_name,
                         fmt_locale=language,
                         user=user,
                         key=key)
         unit = us.unit(unit_name=unit_name)
         if not unit:
             return Response("Unknown unit", status=HTTP_404_NOT_FOUND)
         serializer = UnitSerializer(unit, context={'request': request})
         return Response(serializer.data, content_type="application/json")
     except (UnitSystemNotFound, UnitNotFound):
         return Response("Unknown unit", status=HTTP_404_NOT_FOUND)
Beispiel #8
0
 def list_per_dimension(self, request: HttpRequest, system_name: str):
     """
     List Units grouped by dimension, filter on key, translated
     """
     language = validate_language(
         request.GET.get('language', request.LANGUAGE_CODE))
     try:
         key = request.GET.get('key', None)
         user = request.user if \
             hasattr(request, 'user') and \
             request.user.is_authenticated else None
         us = UnitSystem(system_name=system_name,
                         fmt_locale=language,
                         user=user,
                         key=key)
         dimensions = us.dimensions_cache.values()
         serializer = DimensionWithUnitsSerializer(
             dimensions, many=True, context={'request': request})
         return Response(serializer.data)
     except UnitSystemNotFound as e:
         logging.warning(str(e))
         return Response('Invalid Unit System',
                         status=status.HTTP_404_NOT_FOUND)
Beispiel #9
0
 def compatible_units(self, request: HttpRequest, system_name: str,
                      unit_name: str):
     """
     List compatible Units
     """
     language = validate_language(
         request.GET.get('language', request.LANGUAGE_CODE))
     ordering = request.GET.get('ordering', 'name')
     descending = False
     if ordering and ordering[0] == '-':
         ordering = ordering[1:]
         descending = True
     if ordering not in ['code', 'name']:
         ordering = 'name'
     try:
         key = request.GET.get('key', None)
         user = request.user if \
             hasattr(request, 'user') and \
             request.user.is_authenticated else None
         us = UnitSystem(system_name=system_name,
                         fmt_locale=language,
                         user=user,
                         key=key)
         unit = us.unit(unit_name=unit_name)
         compatible_units = sorted([
             us.unit(unit_name=cunit)
             for cunit in map(str, unit.unit.compatible_units())
         ],
                                   key=lambda x: getattr(x, ordering),
                                   reverse=descending)
         serializer = UnitSerializer(compatible_units,
                                     many=True,
                                     context={'request': request})
         return Response(serializer.data, content_type="application/json")
     except (UnitSystemNotFound, UnitNotFound):
         return Response("Unknown unit", status=HTTP_404_NOT_FOUND)