Source code for moddb.pages.job

import json
import logging
import re

import bs4

from ..boxes import PartialTag, Thumbnail
from ..enums import JobSkill, ThumbnailType
from ..utils import LOGGER, join


[docs] class Job: """Model representing a job proposed on ModDB Parameters ----------- html : bs4.BeautifulSoup The html to parse. Allows for finer control. Filtering ---------- skill : :class:`.JobSkill` The job skill looked for earn : :class:`.bool` Whether or not the job is paid Sorting -------- * **location** - order by the location of the job * **name** - order alphabetically, asc is a-z, desc is z-a * **skill** - order by the skill required * **id** - order by upload date, asc is most recent, desc is oldest first Attributes ----------- id : int id of the job name_id : str The name_id of the member, cannot be changed, it's a mix of the original username lowercased with spaces removed and shortened. author : Thumbnail A member like thumbnail representing the poster of the job. Can be none if they desire to remain private. paid : bool Whether or not the job is paid tags : List[PartialTag] A list of partial tags. You can use `get_tags` and then use the name id to get the right one. skill : JobSkill the skill demanded for the job location : str The location the job will be at name : str The name of the job text : str The description of the job related : List[Thumbnail] A list of team like thumbnails of companies related to the job poster """ def __init__(self, html: bs4.BeautifulSoup): breadcrumb = json.loads(html.find("script", type="application/ld+json").string)[ "itemListElement" ][-1]["Item"] self.name = breadcrumb["name"] self.url = breadcrumb["@id"] self.name_id = self.url.split("/")[0] self.text = html.find("div", id="articlecontent").text profile_raw = html.find("span", string="Jobs").parent.parent.parent.find( "div", class_="table tablemenu" ) self.id = int(re.search(r"siteareaid=(\d*)", html.find("a", string="Report")["href"])[1]) try: author = profile_raw.find("h5", string="Author").parent.span.a self.author = Thumbnail( url=author["href"], name=author.string, type=ThumbnailType.member ) except AttributeError: LOGGER.info("Job '%s' has no author", self.name, exc_info=LOGGER.level >= logging.DEBUG) self.author = None self.paid = profile_raw.find("h5", string="Paid").parent.a.string == "Yes" try: raw_tags = html.find("form", attrs={"name": "tagsform"}).find_all("a") self.tags = [ PartialTag(x.string, join(x["href"]), x["href"].split("/")[-1]) for x in raw_tags if x.string is not None ] except AttributeError: self.tags = [] LOGGER.info( "'%s' '%s' has no tags", self.__class__.__name__, self.name, exc_info=LOGGER.level >= logging.DEBUG, ) self.skill = JobSkill(int(profile_raw.find("h5", string="Skill").parent.span.a["href"][-1])) self.location = profile_raw.find("h5", string="Location").parent.span.string.strip() try: related = html.find("div", class_="tablerelated").find_all("a", class_="image") self.related = [ Thumbnail(url=x["href"], name=x["title"], type=ThumbnailType.team) for x in related ] except AttributeError: LOGGER.info( "Job '%s' has no related companies", self.name, exc_info=LOGGER.level >= logging.DEBUG, ) self.related = [] self._html = html def __repr__(self): return f"<Job name={self.name}>"