Repository: zestedesavoir/zds-site

Issue:
Problèmes de migrations (ZEP25 + suppression des anciennes tables)
Pendant la commande `python manage.py migrate_to_zep25`:

```
[ZEP-25] : New category "Physique" for content "La science au Moyen-e et sous l'Ancien Régime : l'exemple des comètes"
[ZEP-25] : New category "Physique" for content "La limite de Landauer"
[ZEP-25] : New category "Physique" for content "La physique au temps de Newton"
[ZEP-25] : New category "Physique" for content "Pourquoi devons-nous changer de téléviseur en 2016?"
[ZEP-25] : New category "Physique" for content "Comment marchent les disjoncteurs?"
Traceback (most recent call last):
  File "manage.py", line 11, in <module>
    execute_from_command_line(sys.argv)
  File "/opt/zdsenv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
    utility.execute()
  File "/opt/zdsenv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/opt/zdsenv/local/lib/python2.7/site-packages/django/core/management/base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/opt/zdsenv/local/lib/python2.7/site-packages/raven/contrib/django/management/__init__.py", line 41, in new_execute
    return original_func(self, *args, **kwargs)
  File "/opt/zdsenv/local/lib/python2.7/site-packages/django/core/management/base.py", line 445, in execute
    output = self.handle(*args, **options)
  File "/opt/zdsenv/ZesteDeSavoir/zds/tutorialv2/management/commands/migrate_to_zep25.py", line 284, in handle
    self.migrate_zds()
  File "/opt/zdsenv/ZesteDeSavoir/zds/tutorialv2/management/commands/migrate_to_zep25.py", line 231, in migrate_zds
    subcategory = SubCategory.objects.get(title=subcat)
  File "/opt/zdsenv/local/lib/python2.7/site-packages/django/db/models/manager.py", line 127, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/opt/zdsenv/local/lib/python2.7/site-packages/django/db/models/query.py", line 334, in get
    self.model._meta.object_name
zds.utils.models.DoesNotExist: SubCategory matching query does not exist.
```

---

Lors de la suppression des anciennes tables: (voir https://github.com/zestedesavoir/zds-site/blob/release-v18/update.md#supprimer-toute-trace-des-tables-pré-zep-12 )

```
mysql> UPDATE tutorial_tutorial SET last_note_pk=NULL;
ERROR 1054 (42S22): Unknown column 'last_note_pk' in 'field list'
mysql> UPDATE article_article SET last_reaction=NULL;
ERROR 1054 (42S22): Unknown column 'last_reaction' in 'field list'
mysql> DROP TABLE tutorial_tutorial_subcategory;
ERROR 1051 (42S02): Unknown table 'tutorial_tutorial_subcategory'
mysql> DROP TABLE tutorial_tutorial_authors;
Query OK, 0 rows affected (0.08 sec)

mysql> DROP TABLE tutorial_note;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
mysql> DROP TABLE tutorial_tutorialread;
Query OK, 0 rows affected (0.02 sec)
mysql> DROP TABLE tutorial_tutorial;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
mysql> DROP TABLE article_article_subcategory;
ERROR 1051 (42S02): Unknown table 'article_article_subcategory'
mysql> DROP TABLE article_article_authors;
Query OK, 0 rows affected (0.06 sec)

mysql> DROP TABLE article_reaction;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
mysql> DROP TABLE article_articleread;
Query OK, 0 rows affected (0.05 sec)

mysql> DROP TABLE article_article;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
```



Discussion:
cc @gustavi @SpaceFox 

WTF. C'est ici https://github.com/zestedesavoir/zds-site/blob/release-v18/zds/tutorialv2/management/commands/migrate_to_zep25.py#L231 donc on a soit un titre qui n'est pas bon soit c'est encore UTF-8. Je regarde mais je ne comprends pas comment c'est possible.

http://stackoverflow.com/a/17828127 ?

EDIT : je regarde ça d'ici quelques heures, impossible de me connecter en SSH où je suis.

Personne n'a envie d'annuler la v18 mais c'est ce qui pourrait bien arriver si on ne débloque pas la situation rapidement ...

@sandhose Tu sais sur quel tutoriel le script plante pour filer les données à @gustavi ?
@artragis Tu serais nous dire pourquoi le DROP des tables n'a pas fonctionné ?

Visiblement il a pas trouvé les deux premiers champs, ni la table et les autres sont les conséquences des premiers echec.

@sandhose y'a quoi dans la table, tutorial_tutorial et article_article comme champs ?

J'ai créé ces regex à partir des fichiers tels qu'ils étaient dans
l'historique git, il se peut qu'il y ait des problèmes dans le nommage,
mais comme je n'ai pas accès à la béta, je ne saurai vous dire.

2016-05-04 8:52 GMT+02:00 Hugo Courtecuisse notifications@github.com:

> Visiblement il a pas trouvé les deux premiers champs, ni la table et les
> autres sont les conséquences des premiers echec.
> 
> @sandhose https://github.com/sandhose y'a quoi dans la table,
> tutorial_tutorial et article_article comme champs ?
> 
> —
> You are receiving this because you were mentioned.
> Reply to this email directly or view it on GitHub
> https://github.com/zestedesavoir/zds-site/issues/3584#issuecomment-216760530

HS @SpaceFox serveur down, tu peux check (pas possible d'accèder au serveur d'où je suis) /HS

(pas moyen de te contacter facilement autrement)

Ping OK, disk latency à 14 secondes… je crois qu'on ne peut qu'attendre (et
je n'ai normalement pas accès à la prod d'ici non plus).

2016-05-04 11:23 GMT+02:00 Laville Augustin notifications@github.com:

> @SpaceFox https://github.com/SpaceFox serveur down, tu peux check (pas
> possible d'accèder au serveur d'où je suis)
> 
> (pas moyen de te contacter facilement autrement)
> 
> —
> You are receiving this because you were mentioned.
> Reply to this email directly or view it on GitHub
> https://github.com/zestedesavoir/zds-site/issues/3584#issuecomment-216809020

Je confirme ne pas avoir accès à la prod.

Le 4 mai 2016 à 11:27, SpaceFox ujueseo.yeou@gmail.com a écrit :

> Ping OK, disk latency à 14 secondes… je crois qu'on ne peut qu'attendre
> (et je n'ai normalement pas accès à la prod d'ici non plus).
> 
> 2016-05-04 11:23 GMT+02:00 Laville Augustin notifications@github.com:
> 
> > @SpaceFox https://github.com/SpaceFox serveur down, tu peux check (pas
> > possible d'accèder au serveur d'où je suis)
> > 
> > (pas moyen de te contacter facilement autrement)
> > 
> > —
> > You are receiving this because you were mentioned.
> > Reply to this email directly or view it on GitHub
> > https://github.com/zestedesavoir/zds-site/issues/3584#issuecomment-216809020


Resolving patch:
diff --git a/zds/tutorialv2/management/commands/migrate_to_zep25.py b/zds/tutorialv2/management/commands/migrate_to_zep25.py
--- a/zds/tutorialv2/management/commands/migrate_to_zep25.py
+++ b/zds/tutorialv2/management/commands/migrate_to_zep25.py
@@ -174,10 +174,9 @@ def migrate_zds(self):
 
         :return: None
         """
-        sucess = 0
+        success = 0
         fail = 0
-        missing = 0
-        # LAST UPDATE : 20/03/2016 10:30
+        # LAST UPDATE : 05/05/2016 12:30
         contents = {
             # Informatique
             'Bureautique et rédaction': [244, 409, 439, 508, 601, 602, 630],
@@ -185,43 +184,39 @@ def migrate_zds(self):
                 253, 255, 264, 279, 343, 349, 364, 365, 371, 374, 428, 429, 507, 599, 613, 640, 686, 749, 757, 895, 917,
                 1116],
             'Programmation et algorithmique': [5, 28, 30, 39, 43, 54, 56, 60, 61, 65, 66, 67, 78, 96, 100, 152, 158,
-                                               159,
-                                               160, 164, 175, 209, 223, 247, 248, 260, 262, 272, 274, 281, 292, 309,
-                                               312,
-                                               315, 325, 331, 334, 427, 460, 461, 476, 484, 496, 528, 531, 553, 558,
-                                               574,
-                                               582, 591, 597, 609, 612, 621, 624, 634, 644, 645, 646, 674, 681, 685,
-                                               706,
-                                               723, 755, 799, 839, 870, 884, 912, 945, 954, 962],
+                                               159, 160, 164, 175, 209, 223, 247, 248, 260, 262, 272, 274, 281, 292,
+                                               309, 312, 315, 325, 331, 334, 427, 460, 461, 476, 484, 496, 528, 531,
+                                               553, 558, 574, 582, 591, 597, 609, 612, 621, 624, 634, 644, 645, 646,
+                                               674, 681, 685, 706, 723, 755, 799, 839, 870, 884, 912, 944, 945, 954,
+                                               962, 1186, 1226],
             'Site Web': [57, 193, 232, 241, 246, 248, 292, 295, 312, 344, 351, 352, 358, 411, 446, 449, 449, 527, 574,
-                         591,
-                         597, 598, 599, 612, 620, 622, 925, 945],
-            'Systèmes d’exploitation': [37, 39, 97, 100, 130, 143, 158, 268, 317, 357, 507, 607, 624, 609, 662, 683],
+                         591, 597, 598, 599, 612, 620, 622, 925, 945],
+            'Systèmes d\'exploitation': [
+                37, 39, 97, 100, 130, 143, 158, 268, 317, 357, 507, 607, 624, 609, 662, 683, 1034],
             'Autres (informatique)': [4, 12, 88, 193, 245, 250, 297, 299, 321, 323, 324, 351, 379, 415, 723, 730, 925],
             # Sciences de la nature
             'Astronomie': [63, 85, 102, 105, 378, 408],
             'Géologie et géographie physique': [169, 378, 403, 404, 405, 408, 526],
-            'Biologie': [105, 148, 157, 223, 410, 451, 493],
-            'Physique': [74, 148, 164, 279, 381, 428, 614, 895, 1052],
+            'Biologie': [105, 148, 157, 223, 410, 451, 493, 587, 835],
+            'Physique': [74, 148, 164, 279, 381, 428, 614, 857, 895, 1052, 1134],
             'Chimie': [73, 166, 253, 569],
-            'Mathématiques': [27, 43, 54, 65, 66, 67, 160, 244, 281, 329, 484, 528, 596, 676, 735, 803, 810, 829, 1184],
+            'Mathématiques': [
+                27, 43, 54, 65, 66, 67, 160, 244, 281, 329, 484, 528, 596, 676, 735, 763, 803, 810, 829, 1184],
             'Autres (sciences de la nature)': [44],
             # Sciences humaines et sociales
             'Droit': [59, 261, 444],
             'Histoire': [12, 54, 65, 66, 155, 183, 381, 614, 676],
             'Langues': [155, 162, 376, 452, 748],
             'Psychologie': [4, 163, 171, 305, 352, 410, 421, 479, 488, 604, 793],
-            'Économie': [197, 500],
+            'Économie': [197, 500, 1039],
             'Autres (sciences humaines et sociales)': [127],
             # Autres
-            'Arts, graphisme et multimédia': [151, 153, 212, 251, 334, 599, 626, 655, 656, 671, 706, 751, 913],
+            'Arts, graphisme et multimédia': [151, 153, 212, 251, 334, 599, 626, 655, 656, 671, 706, 751, 913, 1186],
             'Communication et management': [305, 341, 391],
             'Zeste de Savoir': [1, 8, 9, 11, 13, 14, 15, 20, 22, 36, 38, 40, 48, 49, 52, 59, 64, 71, 72, 77, 82, 83, 86,
-                                90,
-                                93, 99, 108, 115, 137, 138, 142, 145, 173, 174, 185, 194, 195, 196, 198, 206, 216, 222,
-                                244,
-                                249, 261, 877, 978, 1002, 1120, 1162, ],
-            'Autres': [11, 13, 14, 15, 52, 69, 90, 95, 103, 104, 142, 173, 196, 195, 936, 950, 1139],
+                                90, 93, 99, 108, 115, 137, 138, 142, 145, 173, 174, 185, 194, 195, 196, 198, 206, 216,
+                                222, 244, 249, 261, 877, 978, 1002, 1120, 1062, 1254],
+            'Autres': [11, 13, 14, 15, 52, 69, 90, 95, 103, 104, 142, 173, 196, 195, 936, 950, 1128, 1139, 1214],
         }
         contents_pk = [item['pk'] for item in PublishableContent.objects.values('pk')]
         for subcat, cts in contents.items():
@@ -237,30 +232,21 @@ def migrate_zds(self):
                         # contents with more than one category
                         pass
                     self.stdout.write('[ZEP-25] : New category "{}" for content "{}"'.format(subcategory, content))
-                    sucess += 1
+                    success += 1
                 except PublishableContent.DoesNotExist:
                     self.stdout.write(
                         '[ZEP-25][WARNING] : Content with pk "{}" is not in list, it should not happend in production'
                         .format(ct))
                     fail += 1
 
-        # alert for content not in list
-        for pk in contents_pk:
-            content = PublishableContent.objects.get(pk=pk)
-            self.stdout.write(
-                '[ZEP-25][WARNING] : Content "{}" (pk = {}) is not migrate (not in list), please check it'.format(
-                    content,
-                    pk))
-            missing += 1
-
         # migration details
         self.stdout.write('\n================================================================================\n')
-        self.stdout.write('{} content(s) migrated with succes'.format(sucess))
+        self.stdout.write('{} content(s) migrated with succes'.format(success))
         self.stdout.write('{} content(s) failed'.format(fail))
-        self.stdout.write('{} content(s) unmigrated'.format(missing))
-        if fail != 0 or missing != 0:
+        if fail != 0:
             self.stdout.write('\nPLEASE CHECKS LOGS.')
         self.stdout.write('\n================================================================================\n')
+        self.stdout.write('PLEASE, update by yourself content published after 4 may 2016')
 
     def handle(self, *args, **options):
         if len(args) > 0:


Test patch: