V2 Migration Forum
Révision datée du 6 septembre 2017 à 16:22 par 77.158.24.248 (discussion) (→Proposition de traitement)
Objectif
- Basculer le forum vers phpbb 3.2
- Ancien forum (à peu près) : https://github.com/Conardo/wefrag
- dépôt git : https://github.com/bibiwan/migrationforumwefragv2.git
Architecture applicative
- phpbb 3.2
- Plug-in de modération des topics créés par l'utilisateur : https://github.com/DakinQuelia/phpBB31-Moderate-Own-Topics
- Plug-in de tribune : https://www.phpbb.com/customise/db/extension/ajax_shoutbox/
- Plug-in spoiler : https://www.phpbb-fr.com/customise/db/bbcode/bbcode_spoiler/
- Pour les redirections anciens messages / nouveaux, définition d'un .htaccess avec des règles 301 : http://redirectgenerator.netmagnet.cz/
Avancement
- Migration utilisateurs prête pour tests
- Voir si il existe des users désactivés dans la base wefrag pour les conserver désactivés.
- Migration messages prête pour tests
- todo : topics verrouillés
Procédure
Analyse
- Récupérer le dump du forum.
- Installer un xampp ou équivalent
- Installer phpbb sur son poste
- Utiliser DBeaver ou tout autre autre outil équivalent pour comparer les tables phpbb avec celles du forum (travail manuel)
Transposition
Proposition de traitement
- Migration manuelle des catégories et forums
- Migration de tous les utilisateurs avec pour groupe registered ou admin.
- On génère les mots de passe qu'on stocke avec login et email et ancien user wefrag, on traitera le fichier en batch pour envoyer les mots de passe à chacun par mail.
- On crée une table de correspondance entre iduser wefrag et iduser phpbb et mot de passe provisoire.
- On modifie les tables des topics et posts pour mettre les bons numéros de catégorie / forums manuellement.
- On traite les topics.
- préalable : désactiver la vérification de la hauteur largeur des messages pour ne pas ralentir la procédure
- Pour chaque message de la table wefrag_posts triés par date ascendante :
- Récupérer login et mdp provisoire de l'auteur du message
- Login sur phpbb via l'api avec ces identifiants
- si premier message de topic, message de type post et mise à jour de la table de correspondance ancien topic_id / nouveau
- sinon, message de type reply et recherche du nouvel id de topic avec table de correspondance
- on stocke dans un fichier l'url renvoyée par la méthode de création avec l'id de l'ancien topic pour l'utiliser sur la table de tracking de lecture (table de correspondance et fichier htaccess).
- passage au message suivant
- On traite la table de tracking en utilisant la table de correspondance.
- Migration de tous les utilisateurs avec pour groupe registered ou admin.
insert into phpbb3.phpbb_topics_track(user_id, topic_id, forum_id, mark_time) select tu.id, tt.id, tt.forum_id, UNIX_TIMESTAMP(a.read_at) from wefrag.user_topic_reads a,wefrag.transpo_topics tt, wefrag.transpo_users tu where a.topic_id = tt.oldid and a.user_id = tu.wefrag_id;
- on locke les topics lockés sur wefrag
UPDATE phpbb3.`phpbb_topics` SET topic_status=1 WHERE `topic_id` in ( SELECT a.id FROM wefrag.`transpo_topics` a, wefrag.`posts` b WHERE b.id=a.oldid and b.is_locked=1)
- Envoi par mail des mots de passe par un batch (ou outil genre mailchimp ?) en invitant l'utilisateur à le changer au premier login.
Liste des tables
Table phpbb_users
Voir pour utiliser l'API phpbb add_users
Test effectué sous github.
- user_id (int(10) unsigned) => wefrag_users.id(int(11))
- user_type(tinyint(2)) => 0
- 0 pour tous les inscrits admins compris
- 1 quand pas encore activé
- 2 pour ignorer l'utilisateur (?) ex. bot
- 3 pour les "Founders" : sorte de super-admin en god mode
- Voir https://wiki.phpbb.com/Table.phpbb_users
- group_id(mediumint(8) unsigned) => phpbb_groups.group_id
- user_permission(mediumtext) => vide
- user_perm_from(mediumint(8) unsigned) => 0
- user_ip(varchar(40)) => vide
- user_regdate(int(11) unsigned) => vide
- username(varchar(255)) => wefrag_users.login(varchar(255))
- username_clean(varchar(255)) => wefrag_users.login(varchar(255))
- user_password(varchar(255)) => wefrag_users.crypted_password(varchar(40))
- Phpbb :techno proprio?
- Wefrag : sha1 ? voir ligne 220
- user_passch (int(11) unsigned) => wefrag_user_password_resets.?
- pas forcément nécessaire
- user_email(varchar(100)) => wefrag_users.email(varchar(255))
- vérifier longueur max en table
- user_email_hash(bigint(20)) =>
- d'après ce lien : crc32(strtolower($user_email)) . strlen($user_email),
- à tester
- user_birthday(varchar(10)) => wefrag_users.birthdate(date)
- user_lastvisit(int(11) unsigned) => 0
- user_lastmark(int(11) unsigned) => 0
- user_lastpost_time(int(11) unsigned) =>
Récupérer la date du dernier post.
- user_lastpage(varchar(200)) => vide
- user_last_confirm_key(varchar(10)) => vide
- user_last_search(int(11) unsigned) => 0
- user_warnings(tinyint(4)) => 0
- user_last_warning(int(11) unsigned) => 0
- user_login_attempts(tinyint(4)) => 0
- user_inactive_reason(tinyint(2)) => 0
- user_inactive_time(int(11) unsigned) => 0
- user_posts(mediumint(8) unsigned) =>
Alimenter le nombre de posts
- user_lang(varchar(30)) => fr
- user_timezone(varchar(100)) => vide
- user_dateformat(varchar(64)) => D j M Y H:i
- user_style(mediumint(8) unsigned) => 0
- user_rank(mediumint(8) unsigned) => 0
- user_colour(varchar(6)) => vide
- user_new_privmsg(int(4)) => 0
- user_unread_privmsg(int(4)) => 0
- user_last_privmsg(int(11) unsigned) => 0
- user_message_rules(tinyint(1) unsigned)=> 0
- user_full_folder(int(11))=> -3
- user_emailtime(int(11) unsigned)=> 0
- user_topic_show_days(smallint(4) unsigned) => 0
- user_topic_sortby_type(varchar(1)) => t
- user_topic_sortby_dir (varchar(1)) => d
- user_post_show_days (smallint(4) unsigned) => 0
- user_post_sortby_type(varchar(1)) => t
- user_post_sortby_dir (varchar(1)) => a
- user_notify (tinyint(1) unsigned) => 0
- user_notify_pm (tinyint(1) unsigned) => 1
- user_notify_type (tinyint(4))=> 0
- user_allow_pm(tinyint(1) unsigned) => 1
- user_allow_viewonline(tinyint(1) unsigned) => 1
- user_allow_viewemail(tinyint(1) unsigned) => 1
- user_allow_massemail(tinyint(1) unsigned) => 1
- user_options( int(11) UNSIGNED) => 230271
- user_avatar (varchar(255)) => vide
- user_avatar_type (varchar(255)) => vide
- user_avatar_width (smallint(4) unsigned) => 0
- user_avatar_height (smallint(4) unsigned) => 0
- user_sig (mediumtext) => vide
- user_sig_bbcode_uid (varchar(8)) => vide
- user_sig_bbcode_bitfield (varchar(255)) => vide
- user_jabber (varchar(255)) => vide
- user_actkey (varchar(32)) => vide
- user_newpasswd (varchar(255)) => vide
- user_form_salt (varchar(32)) => ????
- user_new (tinyint(1)) => 1
- user_reminded (tinyint(4)) => 0
- user_reminded_time (int(11) UNSIGNED) => 0
phpbb_forums
Cette entité contient les catégories (wefrag_categories)et les forums (wefrag_forums). Il faut donc prévoir un premier passage pour les catégories et un second pour les forums, et une renumérotation des catégories avec création d'une table de correspondance.
Autre solution : saisie manuelle des catégories, mise à jour de la table wefrag_forums avec les bonnes catégories.
3ème solution (retenue): saisie manuelle des catégories et des forums, mise à jour de la table wefrag_posts avec les bonnes catégories et forums.
Catégories
- forum_id (mediumint(8) unsigned) => wefrag_categories.id (table de correspondance)
- parent_id (mediumint(8) unsigned) => 0
- left_id (mediumint(8) unsigned) => ????
- right_id (mediumint(8) unsigned) => ????
- forum_parents (mediumtext) => vide
- forum_name (varchar(255)) => wefrag_categories.title (varchar(255))
- forum_desc (text) => vide
- forum_desc_bitfield (varchar(255)) => vide
- forum_desc_options (int(11) unsigned) => 7
- forum_desc_uid (varchar(8)) => vide
- forum_link (varchar(255)) => vide
- forum_password (varchar(255)) => vide
- forum_style (mediumint(8) unsigned) => 0
- forum_image (varchar(255)) => vide
- forum_rules (text) => vide
- forum_rules_link (varchar(255)) => vide
- forum_rules_bitfield (varchar(255)) => vide
- forum_rules_options (int(11) unsigned) => 7
- forum_rules_uid (varchar(8)) => vide
- forum_topics_per_page (tinyint(4)) => 0
- forum_type (tinyint(4)) => 0
- forum_status (tinyint(4)) => 0
- forum_last_post_id (int(10) unsigned) => à mettre à jour avec l'identifiant du dernier post de la catégorie
- forum_last_poster_id (int(10) unsigned) => à mettre à jour avec l'identifiant du poster du dernier post de la catégorie
- forum_last_post_subject (varchar(255)) => à mettre à jour avec le sujet du dernier post de la catégorie
- forum_last_post_time (int(11) unsigned ) => à mettre à jour avec le datetime du dernier post de la catégorie
- forum_last_poster_name(varchar(255)) => à mettre à jour avec le login du poster du dernier post de la catégorie
- forum_last_poster_colour(varchar(6)) => à mettre à jour avec la couleur du poster du dernier post de la catégorie
- forum_flags (tinyint(4)) => 32
- display_on_index (tinyint(1) unsigned) => 1
- enable_indexing (tinyint(1) unsigned ) => 1
- enable_icons(tinyint(1) unsigned ) => 1
- enable_prune(tinyint(1) unsigned ) => 0
- prune_next (int(11) unsigned)=> 0
- prune_days (mediumint(8) unsigned)=> 0
- prune_viewed(mediumint(8) unsigned)=> 0
- prune_freq(mediumint(8) unsigned)=> 0
- display_subforum_list (tinyint(1) unsigned)=> 1
- forum_options(int(20) unsigned)=> 0
- forum_posts_approved (mediumint(8) unsigned)=> 0
- forum_posts_unapproved (mediumint(8) unsigned)=> 0
- forum_posts_softdeleted (mediumint(8) unsigned)=> 0
- forum_topics_approved (mediumint(8) unsigned)=> 0
- forum_topics_unapproved (mediumint(8) unsigned)=> 0
- forum_topics_softdeleted (mediumint(8) unsigned)=> 0
- enable_shadow_prune (tinyint(1) unsigned) => 0
- prune_shadow_days (mediumint(8) unsigned)=> 7
- prune_shadow_freq (mediumint(8) unsigned)=> 1
- prune_shadow_next int(11) => 0
Forums
- forum_id (mediumint(8) unsigned) => wefrag_forums.id (int(11))
- parent_id (mediumint(8) unsigned) => wefrag_forums.category_id (table de correspondance)
- left_id (mediumint(8) unsigned) => ????
- right_id (mediumint(8) unsigned) => ????
- forum_parents (mediumtext) => vide
- forum_name (varchar(255)) => wefrag_forums.title (varchar(255))
- forum_desc (text) => wefrag_forums.description (text)
- forum_desc_bitfield (varchar(255)) => vide
- forum_desc_options (int(11) unsigned) => 7
- forum_desc_uid (varchar(8)) => vide
- forum_link (varchar(255)) => vide
- forum_password (varchar(255)) => vide
- forum_style (mediumint(8) unsigned) => 0
- forum_image (varchar(255)) => vide
- forum_rules (text) => vide
- forum_rules_link (varchar(255)) => vide
- forum_rules_bitfield (varchar(255)) => vide
- forum_rules_options (int(11) unsigned) => 7
- forum_rules_uid (varchar(8)) => vide
- forum_topics_per_page (tinyint(4)) => 0
- forum_type (tinyint(4)) => 1
- forum_status (tinyint(4)) => 0
- forum_last_post_id (int(10) unsigned) => à mettre à jour avec l'identifiant du dernier post du forum
- forum_last_poster_id (int(10) unsigned) => à mettre à jour avec l'identifiant du poster du dernier post du forum
- forum_last_post_subject (varchar(255)) => à mettre à jour avec le sujet du dernier post du forum
- forum_last_post_time (int(11) unsigned ) => à mettre à jour avec le datetime du dernier post du forum
- forum_last_poster_name(varchar(255)) => à mettre à jour avec le login du poster du dernier post du forum
- forum_last_poster_colour(varchar(6)) => à mettre à jour avec la couleur du poster du dernier post du forum
- forum_flags (tinyint(4)) => 48
- display_on_index (tinyint(1) unsigned) => 1
- enable_indexing (tinyint(1) unsigned ) => 1
- enable_icons(tinyint(1) unsigned ) => 1
- enable_prune(tinyint(1) unsigned ) => 0
- prune_next (int(11) unsigned)=> 0
- prune_days (mediumint(8) unsigned)=> 0
- prune_viewed(mediumint(8) unsigned)=> 0
- prune_freq(mediumint(8) unsigned)=> 0
- display_subforum_list (tinyint(1) unsigned)=> 1
- forum_options(int(20) unsigned)=> 0
- forum_posts_approved (mediumint(8) unsigned)=> 1
- forum_posts_unapproved (mediumint(8) unsigned)=> 0
- forum_posts_softdeleted (mediumint(8) unsigned)=> 0
- forum_topics_approved (mediumint(8) unsigned)=> 1
- forum_topics_unapproved (mediumint(8) unsigned)=> 0
- forum_topics_softdeleted (mediumint(8) unsigned)=> 0
- enable_shadow_prune (tinyint(1) unsigned) => 0
- prune_shadow_days (mediumint(8) unsigned)=> 7
- prune_shadow_freq (mediumint(8) unsigned)=> 1
- prune_shadow_next int(11) => 0
phpbb_topics
Traitement de toutes les lignes de wefrag_posts qui ont une donnée topic_id non significative.
À étudier : utilisation de la fonction php submit_post Test effectué sous github.
- topic_id (int(10) unsigned) => wefrag_posts.id (int(11))
- forum_id (mediumint(8) unsigned) => wefrag_posts.forum_id (int(11))
- icon_id (mediumint(8) unsigned) => 0
- topic_attachment (tinyint(1) unsigned) => 0
- topic_reported (tinyint(1) unsigned) => 0
- topic_title (varchar(255)) => wefrag_posts.title
- topic_poster (int(10) unsigned) => wefrag_posts.user_id (int(11))
- topic_time (int(11) unsigned) => wefrag_posts.created_at(datetime)
- topic_time_limit (int(11) unsigned) => 0
- topic_views (mediumint(8) unsigned) => 0
- topic_status (tinyint(3)) =>
- à étudier en fonction du statut locké ou pas
- topic_type (tinyint(3)) => 0
- topic_first_post_id (int(10) unsigned) =>
- étudier la nécessité d'insérer le premier post pour avoir une valeur ici
- topic_first_poster_name (varchar(255)) =>
- récupérer le login du poster (wefrag_posts.user_id)
- topic_first_poster_colour
- récupérer la couleur du poster (wefrag_posts.user_id)
- topic_last_post_id
- mettre à jour lors du traitement des posts
- topic_last_poster_id
- mettre à jour lors du traitement des posts
- topic_last_poster_name
- mettre à jour lors du traitement des posts
- topic_last_poster_colour
- mettre à jour lors du traitement des posts
- topic_last_post_subject
- mettre à jour lors du traitement des posts
- topic_last_post_time
- mettre à jour lors du traitement des posts
- topic_last_view_time => mettre la même valeur que topic_last_post_time
- topic_moved_id (int(10) unsigned) => 0
- topic_bumped(tinyint(1) unsigned) => 0
- topic_bumper(mediumint(8) unsigned) => 0
- poll_title (varchar(255)) => vide
- poll_start (int(11) unsigned) => 0
- poll_length (int(11) unsigned) => 0
- poll_max_options (tinyint(4)) => 1
- poll_last_vote (int(11) unsigned) => 0
- poll_vote_change (tinyint(1)) => 0
- topic_visibility (tinyint(3)) => 1
- topic_delete_time (int(11) unsigned) => 0
- topic_delete_reason (varchar(255)) => vide
- topic_delete_user (int(10) unsigned) => 0
- topic_posts_approved (mediumint(8) unsigned) => 1
- topic_posts_unapproved (mediumint(8) unsigned) => 0
- topic_posts_softdeleted (mediumint(8) unsigned) => 0
phpbb_posts
Traitement de toutes les lignes de wefrag_posts.
à étudier : utilisation de la fonction php submit_post
- post_id (int(10) unsigned) => wefrag_posts.id (int(11))
- topic_id (int(10) unsigned) => wefrag_posts.topic_id (int(11))
- forum_id (mediumint(8) unsigned) => wefrag_posts.forum_id (int(11))
- poster_id (int(10) unsigned) => wefrag_posts.user_id (int(11))
- icon_id (mediumint(8) unsigned) => 0
- poster_ip (varchar(40)) => wefrag_posts.poster_ip_address(varchar(255))
- post_time (int(11) unsigned) => wefrag_posts.created_at(datetime)
- post_reported (tinyint(1) unsigned) => 0
- enable_bbcode (tinyint(1) unsigned) => 1
- enable_smilies (tinyint(1) unsigned) => 0
- enable_magic_url (tinyint(1) unsigned) => 1
- enable_sig (tinyint(1) unsigned) => 0
- post_username (varchar(255)) => vide
- post_subject (varchar(255)) => wefrag_posts.title (varchar(255))
- post_text (mediumtext) => wefrag_posts.body (text)
- post_checksum (varchar(32)) =>
- md5 du texte du message.
- post_attachment (tinyint(1) unsigned) => 0
- bbcode_bitfield (varchar(255)) => vide
- bbcode_uid (varchar(8)) => vide
- post_postcount (tinyint(1) unsigned) =>
- vérifier si ce compteur varie…
- post_edit_time (int(11) unsigned) => 0
- post_edit_reason (varchar(255)) => vide
- post_edit_user (int(10) unsigned) => 0
- post_edit_count (smallint(4) unsigned ) => 0
- post_edit_locked (tinyint(1) unsigned) => 0
- post_visibility (tinyint(3)) => 1
- post_delete_time (int(11) unsigned) => 0
- post_delete_reason (varchar(255)) => vide
- post_delete_user(int(10) unsigned) => 0
phpbb_groups
Utilisation de la table wefrag_groups. Nécessaire ou pas en fonction du nombre de groupes dans la base wefrag.
- group_id
- group_type
- group_founder_manage
- group_skip_auth
- group_name
- group_desc
- group_desc_bitfield
- group_desc_options
- group_desc_uid
- group_display
- group_avatar
- group_avatar_type
- group_avatar_width
- group_avatar_height
- group_rank
- group_colour
- group_sig_chars
- group_receive_pm
- group_message_limit
- group_legend
- group_max_recipients
phpbb_user_group
Utilisation de la table wefrag_users pour récupérer le groupe
- group_id (mediumint(8) unsigned) => wefrag_users.group_id(int(11))
- valeur à 2 pour le mettre dans le groupe registered.
- user_id (int(10) unsigned) => wefrag_users.id(int(11))
- group_leader (tinyint(1) unsigned) => 0
- user_pending (tinyint(1) unsigned) => 0
phpbb_topics_track
Utilisation de la table wefrag_user_topic_reads
- user_id => wefrag_user_topic_reads.user_id
- topic_id => wefrag_user_topic_reads.topic_id
- forum_id =>
- récupérer l'id du forum du topic
- mark_time => wefrag_user_topic_reads.read_at
phpbb_topics_posted
Table à alimenter lors de la création d'un topic (et d'un post ?) Non nécessaire si utilisation de l'api à priori.
- user_id
- topic_id
- topic_posted => 1 si topic, 0 si post ?