Beispiel #1
0
    def __init__(self, config, ui=None):
        Node.__init__(self)

        self.config = config
        self.session = Session(self.config)
        self.ui = ui

        # Statistics
        self.total_posts = 0
        self.total_topics = 0
        self.total_users = 0

        self.current_posts = 0
        self.current_topics = 0
        self.current_users = 0

        self.startdate = 0
        self.record_online_date = 0
        self.record_online_users = 0

        self.site_name = ""
        self.site_desc = ""

        self.dump_time = 0

        self.smilies = {}
        self.users = {}
        self.forums = {}
        self.announcements = []

        self.linkrewriter = LinkRewriter(self)
Beispiel #2
0
    def __init__(self, config, ui=None):
        Node.__init__(self)

        self.config = config
        self.session = Session(self.config)
        self.ui = ui

        # Statistics
        self.total_posts = 0
        self.total_topics = 0
        self.total_users = 0

        self.current_posts = 0
        self.current_topics = 0
        self.current_users = 0

        self.startdate = 0
        self.record_online_date = 0
        self.record_online_users = 0

        self.site_name = ""
        self.site_desc = ""

        self.dump_time = 0

        self.smilies = {}
        self.users = {}
        self.forums = {}
        self.announcements = []

        self.linkrewriter = LinkRewriter(self)
Beispiel #3
0
def load(config=None, ui=None):
    """
    Returns the BB node contained in the file save.pickle.
    """
    logger = logging.getLogger("lalf.bb.load")

    if ui is None:
        ui = DummyUI()

    if config is None:
        config = read_config("config.cfg")

    try:
        with open("save.pickle", "rb") as fileobj:
            bb = pickle.load(fileobj)
            bb.config = config
            bb.session = Session(config)
            bb.ui = ui
    except FileNotFoundError:
        bb = BB(config, ui)
    except EOFError:
        logger.warning(
            "Erreur lors du chargement de la sauvegarde. Réinitialisation.")
        bb = BB(config, ui)
    return bb
Beispiel #4
0
class BB(Node):
    """
    The BB node is the root of the tree representing the forum.

    Attrs:
        total_posts (int) : The total number of posts to be exported
        total_topics (int) : The total number of topics to be exported
        total_users (int) : The total number of users to be exported

        current_posts (int) : The number of posts that have been exported
        current_topics (int) : The number of topics that have been exported
        current_users (int) : The number of users that have been exported

        dump_time (int): The time at the beginning of the dump
    """

    # Attributes to save
    STATE_KEEP = ["total_posts", "total_topics", "total_users",
                  "current_posts", "current_topics", "current_users",
                  "startdate", "record_online_date", "record_online_users",
                  "site_name", "site_desc", "smilies", "users",
                  "forums", "announcements"]

    def __init__(self, config, ui=None):
        Node.__init__(self)

        self.config = config
        self.session = Session(self.config)
        self.ui = ui

        # Statistics
        self.total_posts = 0
        self.total_topics = 0
        self.total_users = 0

        self.current_posts = 0
        self.current_topics = 0
        self.current_users = 0

        self.startdate = 0
        self.record_online_date = 0
        self.record_online_users = 0

        self.site_name = ""
        self.site_desc = ""

        self.dump_time = 0

        self.smilies = {}
        self.users = {}
        self.forums = {}
        self.announcements = []

        self.linkrewriter = LinkRewriter(self)

    def _export_(self):
        self.logger.info('Récupération des statistiques')
        response = self.session.get("/statistics")
        document = PyQuery(response.text)

        # Go through the table of statistics and save the relevant
        # ones
        stats = {}
        for element in document.find("table.forumline tr"):
            e = PyQuery(element)

            stats[e("td span").eq(0).text()] = e("td span").eq(1).text()
            stats[e("td span").eq(2).text()] = e("td span").eq(3).text()

        self.total_posts = int(stats["Messages"])
        self.total_topics = int(stats["Nombre de sujets ouvert dans le forum"])
        self.total_users = int(stats["Nombre d'utilisateurs"])

        self.startdate = parse_date(stats["Ouverture du forum"])
        self.record_online_date = parse_date(stats["Date du record de connexions"])
        self.record_online_users = int(
            stats["Nombre record d'utilisateurs connectés en même temps"])

        self.site_name = document("div.maintitle").eq(0).text().strip(" \n")
        self.site_desc = document("div.maintitle").siblings("span.gen").eq(0).text().strip(" \n")

        self.logger.debug('Messages : %d', self.total_posts)
        self.logger.debug('Sujets : %d', self.total_topics)
        self.logger.debug('Membres : %d', self.total_users)

        # Add the children nodes, which respectively handle the
        # exportation of the smilies, the users and the message
        self.add_child(Smilies())

        if self.config["use_ocr"]:
            # Use Optical Character Recognition to get the users'
            # emails
            self.add_child(OcrUsers())
        else:
            self.add_child(Users())

        self.add_child(Groups())

        self.add_child(Forums())

    def _dump_(self, sqlfile):
        self.logger.info("Création du fichier phpbb.sql")
        self.dump_time = int(time.time())

        # Clean tables
        sqlfile.truncate("users")
        sqlfile.truncate("user_group")
        sqlfile.truncate("bots")

        sqlfile.truncate("forums")
        sqlfile.truncate("acl_groups")

        sqlfile.truncate("topics")
        sqlfile.truncate("topics_posted")

        sqlfile.truncate("posts")
        sqlfile.truncate("privmsgs")
        sqlfile.truncate("privmsgs_to")

        sqlfile.truncate("bbcodes")

        # Update configuration and statistics
        sqlfile.set_config("board_startdate", self.startdate)
        sqlfile.set_config("default_lang", self.config["default_lang"])
        sqlfile.set_config("record_online_date", self.record_online_date)
        sqlfile.set_config("record_online_users", self.record_online_users)
        sqlfile.set_config("sitename", self.site_name)
        sqlfile.set_config("site_desc", self.site_desc)

        num_posts = sum(1 for _ in self.get_posts())
        num_topics = sum(1 for _ in self.get_topics())
        num_users = sum(1 for _ in self.users)

        sqlfile.set_config("num_posts", num_posts)
        sqlfile.set_config("num_topics", num_topics)
        sqlfile.set_config("num_users", num_users)

        newest_user_oldid = max(self.users)
        newest_user = self.users[newest_user_oldid]

        sqlfile.set_config("newest_user_id", newest_user.newid)
        sqlfile.set_config("newest_username", newest_user.name)
        sqlfile.set_config("newest_user_colour", newest_user.colour)

        # Add bbcodes tags
        for bbcode in phpbb.BBCODES:
            sqlfile.insert("bbcodes", bbcode)

    def __setstate__(self, state):
        Node.__setstate__(self, state)
        self.linkrewriter = LinkRewriter(self)
        # TODO : recompute current counts

    def save(self):
        """
        Dump the tree representing the forum in a pickle file
        """
        self.logger.info("Sauvegarde de l'état courant.")
        with open("save.pickle", "wb") as fileobj:
            pickle.dump(self, fileobj, 2)

    def get_topics(self):
        """
        Iterator on the topics of the forum
        """
        for forum in self.forums.values():
            for topic in forum.get_topics():
                yield topic

    def get_posts(self):
        """
        Iterator on the posts of the forum
        """
        for topic in self.get_topics():
            for post in topic.get_posts():
                yield post
Beispiel #5
0
class BB(Node):
    """
    The BB node is the root of the tree representing the forum.

    Attrs:
        total_posts (int) : The total number of posts to be exported
        total_topics (int) : The total number of topics to be exported
        total_users (int) : The total number of users to be exported

        current_posts (int) : The number of posts that have been exported
        current_topics (int) : The number of topics that have been exported
        current_users (int) : The number of users that have been exported

        dump_time (int): The time at the beginning of the dump
    """

    # Attributes to save
    STATE_KEEP = [
        "total_posts", "total_topics", "total_users", "current_posts",
        "current_topics", "current_users", "startdate", "record_online_date",
        "record_online_users", "site_name", "site_desc", "smilies", "users",
        "forums", "announcements"
    ]

    def __init__(self, config, ui=None):
        Node.__init__(self)

        self.config = config
        self.session = Session(self.config)
        self.ui = ui

        # Statistics
        self.total_posts = 0
        self.total_topics = 0
        self.total_users = 0

        self.current_posts = 0
        self.current_topics = 0
        self.current_users = 0

        self.startdate = 0
        self.record_online_date = 0
        self.record_online_users = 0

        self.site_name = ""
        self.site_desc = ""

        self.dump_time = 0

        self.smilies = {}
        self.users = {}
        self.forums = {}
        self.announcements = []

        self.linkrewriter = LinkRewriter(self)

    def _export_(self):
        self.logger.info('Récupération des statistiques')
        response = self.session.get("/statistics")
        document = PyQuery(response.text)

        # Go through the table of statistics and save the relevant
        # ones
        stats = {}
        for element in document.find("table.forumline tr"):
            e = PyQuery(element)

            stats[e("td span").eq(0).text()] = e("td span").eq(1).text()
            stats[e("td span").eq(2).text()] = e("td span").eq(3).text()

        self.total_posts = int(stats["Messages"])
        self.total_topics = int(stats["Nombre de sujets ouvert dans le forum"])
        self.total_users = int(stats["Nombre d'utilisateurs"])

        self.startdate = parse_date(stats["Ouverture du forum"])
        self.record_online_date = parse_date(
            stats["Date du record de connexions"])
        self.record_online_users = int(
            stats["Nombre record d'utilisateurs connectés en même temps"])

        self.site_name = document("div.maintitle").eq(0).text().strip(" \n")
        self.site_desc = document("div.maintitle").siblings("span.gen").eq(
            0).text().strip(" \n")

        self.logger.debug('Messages : %d', self.total_posts)
        self.logger.debug('Sujets : %d', self.total_topics)
        self.logger.debug('Membres : %d', self.total_users)

        # Add the children nodes, which respectively handle the
        # exportation of the smilies, the users and the message
        self.add_child(Smilies())

        if self.config["use_ocr"]:
            # Use Optical Character Recognition to get the users'
            # emails
            self.add_child(OcrUsers())
        else:
            self.add_child(Users())

        self.add_child(Groups())

        self.add_child(Forums())

    def _dump_(self, sqlfile):
        self.logger.info("Création du fichier phpbb.sql")
        self.dump_time = int(time.time())

        # Clean tables
        sqlfile.truncate("users")
        sqlfile.truncate("user_group")
        sqlfile.truncate("bots")

        sqlfile.truncate("forums")
        sqlfile.truncate("acl_groups")

        sqlfile.truncate("topics")
        sqlfile.truncate("topics_posted")

        sqlfile.truncate("posts")
        sqlfile.truncate("privmsgs")
        sqlfile.truncate("privmsgs_to")

        sqlfile.truncate("bbcodes")

        # Update configuration and statistics
        sqlfile.set_config("board_startdate", self.startdate)
        sqlfile.set_config("default_lang", self.config["default_lang"])
        sqlfile.set_config("record_online_date", self.record_online_date)
        sqlfile.set_config("record_online_users", self.record_online_users)
        sqlfile.set_config("sitename", self.site_name)
        sqlfile.set_config("site_desc", self.site_desc)

        num_posts = sum(1 for _ in self.get_posts())
        num_topics = sum(1 for _ in self.get_topics())
        num_users = sum(1 for _ in self.users)

        sqlfile.set_config("num_posts", num_posts)
        sqlfile.set_config("num_topics", num_topics)
        sqlfile.set_config("num_users", num_users)

        newest_user_oldid = max(self.users)
        newest_user = self.users[newest_user_oldid]

        sqlfile.set_config("newest_user_id", newest_user.newid)
        sqlfile.set_config("newest_username", newest_user.name)
        sqlfile.set_config("newest_user_colour", newest_user.colour)

        #Add user columns
        #shouldn't they be located to another table ?
        sqlfile.update_config("users", "user_sex", "varchar(1) default NULL")
        sqlfile.update_config("users", "user_date_of_birth",
                              "int(11) default NULL")

        sqlfile.update_config("users", "user_twitter", "varchar(255)")
        sqlfile.update_config("users", "user_facebook", "varchar(255)")
        sqlfile.update_config("users", "user_skype", "varchar(255)")

        #Own columns (specific to my own forum)
        sqlfile.update_config("users", "user_nom_bat", "varchar(255)")
        sqlfile.update_config("users", "user_modele_bat", "varchar(255)")
        sqlfile.update_config("users", "user_port_bat", "varchar(255)")
        sqlfile.update_config("users", "user_mmsi_bat", "varchar(255)")

        # Add bbcodes tags
        for bbcode in phpbb.BBCODES:
            sqlfile.insert("bbcodes", bbcode)

    def __setstate__(self, state):
        Node.__setstate__(self, state)
        self.linkrewriter = LinkRewriter(self)
        # TODO : recompute current counts

    def save(self):
        """
        Dump the tree representing the forum in a pickle file
        """
        self.logger.info("Sauvegarde de l'état courant.")
        with open("save.pickle", "wb") as fileobj:
            pickle.dump(self, fileobj, 2)

    def get_topics(self):
        """
        Iterator on the topics of the forum
        """
        for forum in self.forums.values():
            for topic in forum.get_topics():
                yield topic

    def get_posts(self):
        """
        Iterator on the posts of the forum
        """
        for topic in self.get_topics():
            for post in topic.get_posts():
                yield post