base_fetcher.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import json
  4. from abc import ABCMeta, abstractmethod
  5. DEFAULT_METADATA_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "metadata"))
  6. class BaseFetcher(object):
  7. __metaclass__ = ABCMeta
  8. def __init__(self, provider_name, metadata_dir=None):
  9. if self.__class__ is BaseFetcher:
  10. raise TypeError("Cannot instantiate abstract class BaseFetcher directly")
  11. self.provider_name = provider_name
  12. self.metadata_dir = metadata_dir or DEFAULT_METADATA_DIR
  13. self.metadata = self._load_metadata()
  14. def _load_metadata(self):
  15. file_path = os.path.join(self.metadata_dir, "{}_meta.json".format(self.provider_name))
  16. if not os.path.exists(file_path):
  17. return {}
  18. try:
  19. with open(file_path, "r") as f:
  20. return json.load(f)
  21. except Exception:
  22. return {}
  23. def fetch_external_vac_info(self, origin, target, visa_type, vac_code=None):
  24. """
  25. Hook for retrieving VAC information online from external tools/APIs when not found in metadata.
  26. """
  27. return None
  28. @abstractmethod
  29. def fetch_free_config(self, origin, target, visa_type, vac_code=None):
  30. pass