Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
95.12% covered (success)
95.12%
39 / 41
80.00% covered (warning)
80.00%
8 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 1
PageLevel
95.12% covered (success)
95.12%
39 / 41
80.00% covered (warning)
80.00%
8 / 10
33
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getLevel
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getUser
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isValid
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
12
 equals
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
7
 isValidationAllowed
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
8
 isChangeAllowed
83.33% covered (warning)
83.33%
5 / 6
0.00% covered (danger)
0.00%
0 / 1
5.12
 getUserFromUserName
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
5
 getLevelCategoryName
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getLevelCategoryKey
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace ProofreadPage\Page;
4
5use MediaWiki\Permissions\PermissionManager;
6use MediaWiki\User\User;
7use Wikimedia\IPUtils;
8
9/**
10 * @license GPL-2.0-or-later
11 *
12 * Proofreading level of a Page: page
13 */
14class PageLevel {
15
16    public const WITHOUT_TEXT = 0;
17    public const NOT_PROOFREAD = 1;
18    public const PROBLEMATIC = 2;
19    public const PROOFREAD = 3;
20    public const VALIDATED = 4;
21
22    /**
23     * @var int proofreading level of the page
24     */
25    protected $level = self::NOT_PROOFREAD;
26
27    /**
28     * @var User|null last user of the page
29     */
30    protected $user = null;
31
32    /**
33     * @param int $level
34     * @param User|null $user
35     */
36    public function __construct( $level = self::NOT_PROOFREAD, User $user = null ) {
37        $this->level = $level;
38        $this->user = $user;
39    }
40
41    /**
42     * returns the proofreading level
43     * @return int
44     */
45    public function getLevel(): int {
46        return $this->level;
47    }
48
49    /**
50     * returns the user
51     * @return User|null
52     */
53    public function getUser() {
54        return $this->user;
55    }
56
57    /**
58     * Returns if the level is valid
59     *
60     * @return bool
61     */
62    public function isValid() {
63        return is_int( $this->level ) && $this->level >= 0 && $this->level <= 4;
64    }
65
66    /**
67     * Returns if the level is the same as the level $that
68     *
69     * @param PageLevel|null $that
70     * @return bool
71     */
72    public function equals( PageLevel $that = null ) {
73        if ( $that === null ) {
74            return false;
75        }
76
77        return $this->level === $that->getLevel() &&
78            (
79                ( !$this->user && !$that->getUser() ) ||
80                (
81                    $this->user && $that->getUser() &&
82                    $this->user->getName() === $that->getUser()->getName()
83                )
84            );
85    }
86
87    /**
88     * Returns if the validation of the level $to is allowed.
89     * Helper function for isChangeAllowed()
90     *
91     * @see isChangeAllowed()
92     * @param PageLevel $to
93     * @param PermissionManager $permissionManager
94     * @return bool
95     */
96    public function isValidationAllowed( PageLevel $to, PermissionManager $permissionManager ) {
97        if ( $this->getLevel() === self::VALIDATED ) {
98            return true;
99        }
100
101        if ( $permissionManager->userHasRight( $to->getUser(), 'pagequality-admin' ) ) {
102            return true;
103        }
104
105        $fromUser = $this->user ?: $to->getUser();
106
107        $isSameUser = $fromUser !== null
108            && $fromUser->equals( $to->getUser() );
109
110        if ( $permissionManager->userHasRight( $to->getUser(), 'pagequality-validate' ) ) {
111            if ( $this->level === self::PROOFREAD && !$isSameUser ) {
112                return true;
113            }
114        }
115
116        return false;
117    }
118
119    /**
120     * Returns if the change of level to level $to is allowed
121     *
122     * @param PageLevel $to
123     * @param PermissionManager $permissionManager
124     * @return bool
125     */
126    public function isChangeAllowed( PageLevel $to, PermissionManager $permissionManager ) {
127        if ( $this->level !== $to->getLevel() && ( $to->getUser() === null ||
128            !$permissionManager->userHasRight( $to->getUser(), 'pagequality' ) )
129        ) {
130            return false;
131        }
132
133        if ( $to->getLevel() === self::VALIDATED ) {
134            return $this->isValidationAllowed( $to, $permissionManager );
135        }
136
137        return true;
138    }
139
140    /**
141     * Parse an user name
142     *
143     * @param string|null $name
144     * @return User|null
145     */
146    public static function getUserFromUserName( $name = '' ) {
147        if ( $name === '' || $name === null ) {
148            return null;
149        } elseif ( IPUtils::isValid( $name ) ) {
150            return User::newFromName( IPUtils::sanitizeIP( $name ), false );
151        } else {
152            $user = User::newFromName( $name );
153            return ( $user === false ) ? null : $user;
154        }
155    }
156
157    /**
158     * @return string
159     */
160    public function getLevelCategoryName() {
161        return wfMessage( $this->getLevelCategoryKey() )
162            ->inContentLanguage()->plain();
163    }
164
165    /**
166     * Get the message name of the tracking category this level belongs to
167     */
168    public function getLevelCategoryKey(): string {
169        // Possible messages: proofreadpage_quality0_category,
170        // proofreadpage_quality1_category, proofreadpage_quality2_category,
171        // proofreadpage_quality3_category, proofreadpage_quality4_category
172        return "proofreadpage_quality{$this->level}_category";
173    }
174}