Skip to content

Commit

Permalink
generate voter id #220 (#335)
Browse files Browse the repository at this point in the history
---------

Co-authored-by: Camila Maia <cmaiacd@gmail.com>
  • Loading branch information
patricia-salles and camilamaia committed Jun 7, 2024
1 parent 0f12511 commit 280f0ba
Show file tree
Hide file tree
Showing 6 changed files with 126 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Utilit谩rio `remove_symbols_phone` [#188](https://github.com/brazilian-utils/brutils-python/pull/188)
- Utilit谩rio `remove_symbols_pis` [#236](https://github.com/brazilian-utils/brutils-python/pull/236)
- Utilit谩rio `remove_symbols_legal_process` [#209](https://github.com/brazilian-utils/brutils-python/pull/209)
- Utilit谩rio `generate_titulo_eleitoral` [#220](https://github.com/brazilian-utils/brutils-python/pull/220)

### Removed

Expand Down
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ False

- [T铆tulo Eleitoral](#titulo-eleitoral)
- [is_valid_voter_id](#is_valid_voter_id)
- [generate_voter_id](#generate_voter_id)

## CPF

Expand Down Expand Up @@ -897,6 +898,27 @@ False
True
```

### generate_voter_id

Gera uma string de d铆gitos de T铆tulo de Eleitor v谩lida aleat贸ria a partir de um estado brasileiro informado.

Args:
* federative_union (str): Unidade federativa para o t铆tulo de eleitor que ser谩 gerado. O valor padr茫o "ZZ" 茅 usado para t铆tulos de eleitor emitidos para estrangeiros.

Retorna:
* str: Um T铆tulo de eleitor v谩lido gerado aleatoriamente.

Exemplo:

```python
>>> from brutils import generate_voter_id
>>> generate_voter_id()
'183475722801'
>>> generate_voter_id(federative_union ="MG")
'950125640248'
```


# Novos Utilit谩rios e Reportar Bugs

Caso queira sugerir novas funcionalidades ou reportar bugs, basta criar
Expand Down
21 changes: 21 additions & 0 deletions README_EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ False

- [Voter ID](#voter-id)
- [is_valid_voter_id](#is_valid_voter_id)
- [generate_voter_id](#generate_voter_id)

## CPF

Expand Down Expand Up @@ -905,6 +906,26 @@ False
True
```

### generate_voter_id

Generate a valid random Voter ID string of digits from an informed Brazilian federation union.

Args:
* federative_union(str): federative union for the voter id that will be generated. The default value "ZZ" is used for voter IDs issued to foreigners.

Returns:
* str: A randomly generated valid voter ID.

Example:

```python
>>> from brutils import generate_voter_id
>>> generate_voter_id()
'183475722801'
>>> generate_voter_id(federative_union ="MG")
'950125640248'
```

# Feature Request and Bug Report

If you want to suggest new features or report bugs, simply create
Expand Down
3 changes: 3 additions & 0 deletions brutils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@
from brutils.pis import (
remove_symbols as remove_symbols_pis,
)
from brutils.voter_id import (
generate as generate_voter_id,
)
from brutils.voter_id import (
is_valid as is_valid_voter_id,
)
58 changes: 58 additions & 0 deletions brutils/voter_id.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
from random import randint


def is_valid(voter_id): # type: (str) -> bool
"""
Check if a Brazilian voter id number is valid.
Expand Down Expand Up @@ -204,4 +207,59 @@ def _calculate_vd2(federative_union, vd1): # type: (str, int) -> str
if federative_union in ["01", "02"] and rest == 0:
vd2 = 1

# edge case: rest == 10, declare vd2 as zero
if rest == 10:
vd2 = 0

return vd2


def generate(federative_union="ZZ") -> str:
"""
Generates a random valid Brazilian voter registration.
Args:
federative_union(str): federative union for the voter id that will be generated. The default value "ZZ" is used for voter IDs issued to foreigners.
Returns:
str: A randomly generated valid voter ID for the given federative union
"""
UFs = {
"SP": "01",
"MG": "02",
"RJ": "03",
"RS": "04",
"BA": "05",
"PR": "06",
"CE": "07",
"PE": "08",
"SC": "09",
"GO": "10",
"MA": "11",
"PB": "12",
"PA": "13",
"ES": "14",
"PI": "15",
"RN": "16",
"AL": "17",
"MT": "18",
"MS": "19",
"DF": "20",
"SE": "21",
"AM": "22",
"RO": "23",
"AC": "24",
"AP": "25",
"RR": "26",
"TO": "27",
"ZZ": "28",
}

federative_union = federative_union.upper()
if federative_union in (UFs):
sequential_number = str(randint(0, 99999999)).zfill(8)
uf_number = UFs[federative_union]
if _is_federative_union_valid(uf_number):
vd1 = _calculate_vd1(sequential_number, uf_number)
vd2 = _calculate_vd2(uf_number, vd1)
return f"{sequential_number}{uf_number}{vd1}{vd2}"
22 changes: 21 additions & 1 deletion tests/test_voter_id.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
_get_sequential_number,
_get_verifying_digits,
_is_length_valid,
generate,
is_valid,
)

Expand Down Expand Up @@ -79,14 +80,33 @@ def test_calculate_vd1(self):
self.assertIs(_calculate_vd1("73146415", "03"), 0)

def test_calculate_vd2(self):
self.assertIs(_calculate_vd2("03", 7), 10)
self.assertIs(_calculate_vd2("02", 7), 2)
# edge case: if rest == 10, declare vd2 as zero
self.assertIs(_calculate_vd2("03", 7), 0)
# edge case: if UF is "01" (for SP) and rest == 0
# declare dv2 as 1 instead
self.assertIs(_calculate_vd2("01", 4), 1)
# edge case: if UF is "02" (for MG) and rest == 0
# declare dv2 as 1 instead
self.assertIs(_calculate_vd2("02", 8), 1)

def test_generate_voter_id(self):
# test if is_valid a voter id from MG
voter_id = generate(federative_union="MG")
self.assertIs(is_valid(voter_id), True)

# test if is_valid a voter id from AC
voter_id = generate(federative_union="AC")
self.assertIs(is_valid(voter_id), True)

# test if is_valid a voter id from foreigner
voter_id = generate()
self.assertIs(is_valid(voter_id), True)

# test if UF is not valid
voter_id = generate(federative_union="XX")
self.assertIs(is_valid(voter_id), False)


if __name__ == "__main__":
main()

0 comments on commit 280f0ba

Please sign in to comment.