up liste changements récents

This commit is contained in:
Tykayn 2025-08-31 23:12:38 +02:00 committed by tykayn
parent a59113400c
commit 58848a78ab
6 changed files with 1339 additions and 234 deletions

35
CHANGES.md Normal file
View file

@ -0,0 +1,35 @@
# Changements apportés
## Ajout d'une section "Équipe Wiki OSM FR" sur la page des changements récents
### Description
Ajout d'une nouvelle section au début de la page des changements récents qui liste les membres de l'équipe Wiki OSM FR avec des liens vers leurs pages d'utilisateur, en indiquant le nombre de modifications dans un badge à côté du nom de l'utilisateur. Les utilisateurs sont triés par ordre décroissant du nombre de contributions. À côté de chaque utilisateur, on affiche également le nombre de caractères ajoutés, modifiés et supprimés.
### Fichiers modifiés
1. **src/Controller/WikiController.php**
- Ajout d'une nouvelle méthode `processTeamMembersStats()` qui traite les données des changements récents pour extraire les statistiques des membres de l'équipe
- Mise à jour de la méthode `recentChanges()` pour appeler cette nouvelle méthode et passer les données à la template
2. **templates/admin/wiki_recent_changes.html.twig**
- Ajout d'une nouvelle section au début de la page qui affiche les statistiques des membres de l'équipe
- Implémentation des liens utilisateur et des badges comme spécifié
- Affichage du nombre de caractères ajoutés, modifiés et supprimés avec un code couleur
### Fonctionnalités
- **Traitement des données** : Les données des changements récents sont traitées pour extraire les statistiques par utilisateur
- **Tri des utilisateurs** : Les utilisateurs sont triés par ordre décroissant du nombre de contributions
- **Affichage des statistiques** : Pour chaque utilisateur, on affiche :
- Un lien vers sa page d'utilisateur
- Un badge indiquant le nombre de modifications
- Le nombre de caractères ajoutés (en vert)
- Le nombre de caractères modifiés (en jaune), si applicable
- Le nombre de caractères supprimés (en rouge), si applicable
- **Mise en page responsive** : La section utilise une mise en page responsive avec Bootstrap (3 colonnes sur les écrans moyens et grands)
### Notes techniques
- La méthode `processTeamMembersStats()` gère différents formats de taille de changement, y compris les valeurs numériques, le format "+123" et le format "123" (avec un signe moins spécial)
- La section n'est affichée que s'il y a des membres d'équipe à montrer
- Des tooltips sont ajoutés pour expliquer ce que représente chaque nombre lorsqu'on survole les statistiques de caractères

File diff suppressed because one or more lines are too long

View file

@ -111,6 +111,7 @@ class WikiController extends AbstractController
// Initialize arrays
$recentChanges = [];
$lastUpdated = null;
$teamMembers = [];
// Check if the recent changes file exists and load it
if (file_exists($recentChangesFile)) {
@ -119,6 +120,9 @@ class WikiController extends AbstractController
if (isset($recentChangesData['recent_changes']) && is_array($recentChangesData['recent_changes'])) {
$recentChanges = $recentChangesData['recent_changes'];
$lastUpdated = isset($recentChangesData['last_updated']) ? $recentChangesData['last_updated'] : null;
// Process team members statistics
$teamMembers = $this->processTeamMembersStats($recentChanges);
}
// Check if the data is older than 1 hour
@ -147,9 +151,69 @@ class WikiController extends AbstractController
return $this->render('admin/wiki_recent_changes.html.twig', [
'recent_changes' => $recentChanges,
'last_updated' => $lastUpdated
'last_updated' => $lastUpdated,
'team_members' => $teamMembers
]);
}
/**
* Process team members statistics from recent changes data
*
* @param array $recentChanges Recent changes data
* @return array Team members statistics
*/
private function processTeamMembersStats(array $recentChanges): array
{
$teamMembers = [];
// Group changes by user and count modifications
foreach ($recentChanges as $change) {
$user = $change['user'];
$changeSize = $change['change_size'];
// Initialize user data if not exists
if (!isset($teamMembers[$user])) {
$teamMembers[$user] = [
'username' => $user,
'contributions' => 0,
'chars_added' => 0,
'chars_changed' => 0,
'chars_deleted' => 0,
'user_url' => "https://wiki.openstreetmap.org/wiki/User:" . urlencode($user)
];
}
// Increment contribution count
$teamMembers[$user]['contributions']++;
// Process change size
if (is_numeric($changeSize)) {
$changeSize = (int) $changeSize;
if ($changeSize > 0) {
$teamMembers[$user]['chars_added'] += $changeSize;
} elseif ($changeSize < 0) {
$teamMembers[$user]['chars_deleted'] += abs($changeSize);
} else {
// Change size is 0, might be a new page or other change
$teamMembers[$user]['chars_changed'] += 0;
}
} elseif (preg_match('/^\+(\d+)$/', $changeSize, $matches)) {
// Format like "+123"
$teamMembers[$user]['chars_added'] += (int) $matches[1];
} elseif (preg_match('/^(\d+)$/', $changeSize, $matches)) {
// Format like "123" (note: this is not a regular minus sign)
$teamMembers[$user]['chars_deleted'] += (int) $matches[1];
}
}
// Convert to indexed array and sort by contributions count (descending)
$teamMembers = array_values($teamMembers);
usort($teamMembers, function($a, $b) {
return $b['contributions'] - $a['contributions'];
});
return $teamMembers;
}
/**
* Refresh the recent changes data by running the fetch_recent_changes.py script

View file

@ -15,6 +15,38 @@
</div>
{% endif %}
{% if team_members|length > 0 %}
<div class="card mb-4">
<div class="card-header bg-success text-white">
<h2>Équipe Wiki OSM FR</h2>
<p class="mb-0">Contributeurs classés par nombre de modifications</p>
</div>
<div class="card-body">
<div class="row">
{% for member in team_members %}
<div class="col-md-4 mb-3">
<div class="d-flex align-items-center">
<a href="{{ member.user_url }}" target="_blank" class="text-decoration-none">
<span class="fw-bold">{{ member.username }}</span>
</a>
<span class="badge bg-primary ms-2">{{ member.contributions }}</span>
<div class="ms-2 small">
<span class="text-success" title="Caractères ajoutés">+{{ member.chars_added }}</span>
{% if member.chars_changed > 0 %}
<span class="text-warning" title="Caractères modifiés">~{{ member.chars_changed }}</span>
{% endif %}
{% if member.chars_deleted > 0 %}
<span class="text-danger" title="Caractères supprimés">-{{ member.chars_deleted }}</span>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endif %}
<div class="card mb-4">
<div class="card-header bg-primary text-white">
<h2>Changements récents</h2>
@ -43,16 +75,45 @@
{% for change in recent_changes %}
<tr>
<td>
<strong>{{ change.page_name }}</strong>
<strong>
<a href="{{ change.page_url }}" target="_blank" class="text-decoration-none">
{{ change.page_name }}
</a>
</strong>
</td>
<td>{{ change.timestamp }}</td>
<td>{{ change.user }}</td>
<td>{{ change.comment }}</td>
<td>
{% if change.user_url %}
<a href="{{ change.user_url }}" target="_blank" class="text-decoration-none">
{{ change.user }}
</a>
{% else %}
{{ change.user }}
{% endif %}
</td>
<td>
{{ change.comment }}
{% if change.added_text or change.removed_text %}
<div class="mt-1 small">
{% if change.added_text %}
<span class="text-success">{{ change.added_text }}</span>
{% endif %}
{% if change.removed_text %}
<span class="text-danger">{{ change.removed_text }}</span>
{% endif %}
</div>
{% endif %}
</td>
<td>{{ change.change_size }}</td>
<td>
<a href="{{ change.page_url }}" target="_blank" class="btn btn-sm btn-outline-primary">
<i class="bi bi-box-arrow-up-right"></i> Voir
</a>
{% if change.diff_url %}
<a href="{{ change.diff_url }}" target="_blank" class="btn btn-sm btn-outline-secondary mt-1">
<i class="bi bi-file-diff"></i> Diff
</a>
{% endif %}
</td>
</tr>
{% endfor %}

View file

@ -6,7 +6,7 @@ fetch_recent_changes.py
This script fetches recent changes from the OpenStreetMap wiki for the French namespace
and stores the URLs of these pages. It specifically targets the recent changes page:
https://wiki.openstreetmap.org/w/index.php?hidebots=1&hidepreviousrevisions=1&hidecategorization=1&hideWikibase=1&hidelog=1&hidenewuserlog=1&namespace=202&limit=500&days=30&enhanced=1&title=Special:RecentChanges&urlversion=2
https://wiki.openstreetmap.org/w/index.php?hidebots=1&hidepreviousrevisions=1&hidecategorization=1&hideWikibase=1&hidelog=1&hidenewuserlog=1&namespace=202&limit=10000&days=365&enhanced=1&title=Special:RecentChanges&urlversion=2
Usage:
python fetch_recent_changes.py [--dry-run] [--force]
@ -170,6 +170,21 @@ def extract_recent_changes(html_content):
user_link = item.find('a', class_='mw-userlink')
user = user_link.get_text().strip() if user_link else "Unknown"
# Extract the user profile URL
user_url = ""
if user_link and user_link.get('href'):
user_url = user_link.get('href')
if not user_url.startswith('http'):
user_url = WIKI_BASE_URL + user_url
# Extract the diff link
diff_url = ""
diff_link = item.find('a', class_='mw-changeslist-diff') or item.find('a', string='diff')
if diff_link and diff_link.get('href'):
diff_url = diff_link.get('href')
if not diff_url.startswith('http'):
diff_url = WIKI_BASE_URL + diff_url
# Extract the comment from the comment class
comment_span = item.find('span', class_='comment')
comment = comment_span.get_text().strip() if comment_span else ""
@ -186,13 +201,39 @@ def extract_recent_changes(html_content):
if size_matches:
change_size = size_matches[0]
# Extract text differences if diff_url is available
added_text = ""
removed_text = ""
if diff_url:
try:
# Fetch the diff page
diff_html = get_page_content(diff_url)
if diff_html:
diff_soup = BeautifulSoup(diff_html, 'html.parser')
# Find added text (ins elements)
added_elements = diff_soup.find_all('ins', class_='diffchange')
if added_elements:
added_text = ' '.join([el.get_text().strip() for el in added_elements])
# Find removed text (del elements)
removed_elements = diff_soup.find_all('del', class_='diffchange')
if removed_elements:
removed_text = ' '.join([el.get_text().strip() for el in removed_elements])
except Exception as e:
logger.error(f"Error fetching diff page {diff_url}: {e}")
recent_changes.append({
"page_name": page_name,
"page_url": page_url,
"timestamp": timestamp,
"user": user,
"user_url": user_url,
"comment": comment,
"change_size": change_size
"change_size": change_size,
"diff_url": diff_url,
"added_text": added_text,
"removed_text": removed_text
})
logger.debug(f"Extracted change: {page_name} by {user}")

File diff suppressed because one or more lines are too long