示例#1
0
    def test_dict_filter_by_list(self):
        original1 = {'A': 1, 'B': 2, 'C': {'E': 3}, 'D': 4}
        filtered = dict_filter_by_list(original1, {4, 'D', 'C', 'd'})
        self.assertEqual({'D': 4, 'C': {'E': 3}}, filtered)

        original2 = {'A', 'B'}
        filtered = dict_filter_by_list(original2, {})
        self.assertEqual(set(), filtered)
        filtered = dict_filter_by_list(original2, original2)
        self.assertEqual(original2, filtered)
示例#2
0
    def test_dict_filter_by_list(self):
        original1 = {"A": 1, "B": 2, "C": {"E": 3}, "D": 4}
        filtered = dict_filter_by_list(original1, {4, "D", "C", "d"})
        self.assertEqual({"D": 4, "C": {"E": 3}}, filtered)

        original2 = {"A", "B"}
        filtered = dict_filter_by_list(original2, {})
        self.assertEqual(set(), filtered)
        filtered = dict_filter_by_list(original2, original2)
        self.assertEqual(original2, filtered)
示例#3
0
 def _parse_term(self, term, term_code, query):
     self.ingestor['term'] = term
     query['termId'] = term_code
     query['requestType'] = 'DEPARTMENTS'
     depts = dict_filter_by_list(self._extract_json(query),
                                 self.departments_filter)
     for dept, dept_code in list(depts.items()):
         self._parse_dept(dept, dept_code, query)
示例#4
0
 def _parse_term(self, term, term_code, query):
     self.ingestor['term'] = term
     query['termId'] = term_code
     query['requestType'] = 'DEPARTMENTS'
     depts = dict_filter_by_list(self._extract_json(query),
                                 self.departments_filter)
     for dept, dept_code in depts.items():
         self._parse_dept(dept, dept_code, query)
示例#5
0
    def start(
        self,
        verbosity=3,
        textbooks=True,
        departments_filter=None,
        years_and_terms_filter=None,
    ):
        """Start the parse."""
        self.verbosity = verbosity

        self._login()

        years_and_terms = dict_filter_by_dict(self._parse_years_and_terms(),
                                              years_and_terms_filter)
        for year, terms in years_and_terms.items():
            self.ingestor["year"] = year
            for term_name, term_code in terms.items():
                self.ingestor["term"] = term_name

                # Load environment for targeted semester
                self.requester.get(
                    Parser.URL + "/SelectTerm!selectTerm.action",
                    params={"selectedTermCode": term_code},
                    parse=False,
                )

                self.requester.get(Parser.URL +
                                   "/SelectTerm!updateSessions.action",
                                   parse=False)

                # Create payload to request course list from server
                params = {
                    "searchCriteria.classStatusCodes": ["O", "W", "C"],
                    "__checkbox_searchCriteria.classStatusCodes":
                    ["O", "W", "C"],
                }

                departments = dict_filter_by_list(
                    dict(self.extract_department_codes()), departments_filter)
                for dept_code, dept_name in departments.items():
                    self.ingestor["department_code"] = dept_code
                    self.ingestor["department_name"] = dept_name

                    # Construct payload with department code
                    params.update(
                        {"searchCriteria.subjectAreaCodes": dept_code})

                    # GET html for department course listings
                    soup = self.requester.get(
                        Parser.URL + "/SearchClassesExecute!search.action",
                        params=params,
                    )

                    # Parse courses in department
                    self.parse_courses_in_department(soup)

                # return to search page for next iteration
                self.requester.get(Parser.URL + "/Entry.action", parse=False)
示例#6
0
    def test_dict_filter_by_list(self):
        original1 = {
            'A': 1,
            'B': 2,
            'C': {'E': 3},
            'D': 4
        }
        filtered = dict_filter_by_list(original1, {4, 'D', 'C', 'd'})
        self.assertEqual({'D': 4, 'C': {'E': 3}}, filtered)

        original2 = {
            'A',
            'B'
        }
        filtered = dict_filter_by_list(original2, {})
        self.assertEqual(set(), filtered)
        filtered = dict_filter_by_list(original2, original2)
        self.assertEqual(original2, filtered)
示例#7
0
 def _get_departments(self, soup, departments_filter=None):
     if self._get_selected_term(soup) == self.intially_selected_term:
         sys.stderr.write('GET DEPARTMENTS')
         return dict_filter_by_list(
             self.saved_departments,
             departments_filter
         ), None
     return super(QPeoplesoftParser, self)._get_departments(
         soup,
         departments_filter
     )
示例#8
0
    def _get_departments(self, soup, departments_filter=None):
        dept_soups = soup.find(
            'select',
            id=re.compile(r'SSR_CLSRCH_WRK_SUBJECT_SRCH\$\d')
        ).find_all('option')[1:]

        def extract_dept_name(d):
            return self.department_name_regex.match(d).group(1)
        departments = {
            d['value']: extract_dept_name(d.text) for d in dept_soups
        }
        return dict_filter_by_list(departments, departments_filter), None
示例#9
0
 def _get_departments(self, soup, departments_filter=None):
     # extract department query list
     departments = soup.find_all(
         'a',
         id=re.compile(r'CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH\$\d')
     )
     department_names = soup.find_all(
         'span',
         id=re.compile(r'M_SR_SS_SUBJECT_DESCR\$\d')
     )
     depts = {
         dept.text: dept_name.text
         for dept, dept_name in zip(departments, department_names)
     }
     dept_ids = {dept.text: dept['id'] for dept in departments}
     return dict_filter_by_list(
         depts,
         departments_filter,
     ), dept_ids
示例#10
0
    def start(self,
              verbosity=3,
              textbooks=True,
              departments_filter=None,
              years_and_terms_filter=None):
        """Start the parse."""
        self.verbosity = verbosity

        self._login()

        years_and_terms = dict_filter_by_dict(self._parse_years_and_terms(),
                                              years_and_terms_filter)
        for year, terms in years_and_terms.items():
            self.ingestor['year'] = year
            for term_name, term_code in terms.items():
                self.ingestor['term'] = term_name

                # Load environment for targeted semester
                self.requester.get(
                    Parser.URL + '/SelectTerm!selectTerm.action',
                    params={'selectedTermCode': term_code},
                    parse=False
                )

                self.requester.get(
                    Parser.URL + '/SelectTerm!updateSessions.action',
                    parse=False
                )

                # Create payload to request course list from server
                params = {
                    'searchCriteria.classStatusCodes': [
                        'O', 'W', 'C'
                    ],
                    '__checkbox_searchCriteria.classStatusCodes': [
                        'O', 'W', 'C'
                    ]
                }

                departments = dict_filter_by_list(
                    dict(self.extract_department_codes()),
                    departments_filter
                )
                for dept_code, dept_name in departments.items():
                    self.ingestor['department_code'] = dept_code
                    self.ingestor['department_name'] = dept_name

                    # Construct payload with department code
                    params.update({
                        'searchCriteria.subjectAreaCodes': dept_code
                    })

                    # GET html for department course listings
                    soup = self.requester.get(
                        Parser.URL + '/SearchClassesExecute!search.action',
                        params=params
                    )

                    # Parse courses in department
                    self.parse_courses_in_department(soup)

                # return to search page for next iteration
                self.requester.get(Parser.URL + '/Entry.action',
                                   parse=False)