Home > Blockchain >  Adding multiple variables in an object - need further assistance
Adding multiple variables in an object - need further assistance

Time:03-17

First thing first - upon suggestions, please do your best to be understandable for newbies as if it is too complex, it may not be much useful as I need to furtherly continue after the current ask. Thank you in advance for that :)

I'm trying to define an object with multiple variables that I may use. So far I was able to create the basic class for myself (with just ID of the object), but I am now struggling to add the rest of the variables needed for the object.

The data that I have to store with the multiple instance of the object is as follows:

  • id of the user - this is the value thru which I need to be searching thru the objects as I will have multiple entries of the below example data for different time intervals that I need to count. It does not need to be changed within the objects variables.
  • Name - The name of the person for whom I will be counting the hours spent. It is static (does not need to be changed within the objects variables).
  • Started timestamp and Ended timestamp - The time within which the person has executed things. As I will have multiple instances of data coming towards the object, I need to check for overlapping of shifts and if so, such hours to be avoided, but if extra hours beside the overlapped - to be added. E.g. if overlapping is not a perfect match, then the additional time spent to be added to the "total spent hours". The data received for both timestamps are in format that I convert into datatime with "datetime.strptime(start, '%Y-%m-%dT%H:%M:%S 02:00')
  • Schedule ID - it is the ID of the entry for the started and ended timestamps. It may be saved as an array as it will not be used except for reporting purposes - e.g. the person has processed things during it's first shift (start_timestamp thru end_timestamp).
  • Array of contacts that I need to separate to two different values - one for e-mail, other for phone number (including country code). The array returns as [email, country_code, phone_number]

Quote of example data that I have:

PersonID: ID1234
Name: Anton Todorov
Started at: 2022-12-26T00:00:00 02:00
Ended at: 2022-12-26T02:00:00 02:00
Schedule ID: SCHEDID1
Contacts: ['[email protected]', 359, '000000000']
---===Separator===---
PersonID: ID5678
Name: Morgan Freeman
Started at: 2022-12-26T02:00:00 02:00
Ended at: 2022-12-26T14:00:00 02:00
Schedule ID: SCHEDID2
Contacts: ['[email protected]', 1, '0000000000']
---===Separator===---
PersonID: ID1234
Name: Anton Todorov
Started at: 2022-12-26T14:00:00 02:00
Ended at: 2022-12-27T02:00:00 02:00
Schedule ID: SCHEDID3
Contacts: ['[email protected]', 359, '000000000']

So with that on, I have to calculate the total hours that each person has spend from within these sections of data that I have.

The object that I have so far is as follows:

class DataItem(object):
    def __init__(self, person_id):
        self._person_id = person_id

        self._updatable_id = ""

    @property
    def person_id(self):
        return self._person_id

    @property
    def updatable_id(self):
        return self._updatable_id

    @updatable_id.setter
    def updatable_id(self, value):
        self._updatable_id = value

    @updatable_id.deleter
    def updatable_id(self):
        del self._updatable_id


class Persons(object):
    def __init__(self):
        self._ids = []

    def find_person_by_id(self, person_id):
        # search by id
        existing = [i for i in self._ids if i.person_id == person_id]

        if not existing:
            # create and append
            existing_person = DataItem(id)
            self._ids.append(existing_person)

        else:
            # assign to existing
            existing_person = existing[0]

        # return the object to be acted upon
        return existing_person

So.. Would someone be able to assist me with furtherly developing the object so that I may be storing the data properly inside of each of its instances, please?

I would gladly appreciate all detailed suggestions (especially as soon as I am also able to understand them).

Thank you all in advance!

CodePudding user response:

Based on what you are doing I would consider doing json data format and do something like this. Please excuse my quick and dirty code but I think fundamentally you are looking for a way to create a data format that might work for your scenario.

Looking over it one more time, I feel like this might be the format you are looking for

[
    {
        "person_id": "ID1234",
        "name": "Anton Todorov",
        "schedule": [
            {
                "schedule_id": "SCHEDID1",
                "started_at": "2022-12-26T00:00:00 02:00",
                "ended_at": "2022-12-26T02:00:00 02:00"
            },
            {
                "schedule_id": "SCHEDID3",
                "started_at": "2022-12-26T14:00:00 02:00",
                "ended_at": "2022-12-27T02:00:00 02:00"
            }
        ],
        "contact_info": {
            "email": "[email protected]",
            "country_code": 359,
            "phone_number": "000000000"
        }
    },
    {
        "person_id": "ID5678",
        "name": "Morgan Freeman",
        "schedule": [
            {
                "schedule_id": "SCHEDID2",
                "started_at": "2022-12-26T02:00:00 02:00",
                "ended_at": "2022-12-26T14:00:00 02:00"
            }
        ],
        "contact_info": {
            "email": "[email protected]",
            "country_code": 1,
            "phone_number": "000000000"
        }
    }
]

Code:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json

def main():
    people = list()

    person = dict()
    person['person_id'] = 'ID1234'
    person['name'] = 'Anton Todorov'
    person['schedule'] = list()
    schedule = dict()
    schedule['schedule_id'] = 'SCHEDID1'
    schedule['started_at'] = '2022-12-26T00:00:00 02:00'
    schedule['ended_at'] = '2022-12-26T02:00:00 02:00'
    person['schedule'].append(schedule)
    schedule = dict()
    schedule['schedule_id'] = 'SCHEDID3'
    schedule['started_at'] = '2022-12-26T14:00:00 02:00'
    schedule['ended_at'] = '2022-12-27T02:00:00 02:00'
    person['schedule'].append(schedule)
    contact_info = dict()
    contact_info['email'] = '[email protected]'
    contact_info['country_code'] = 359
    contact_info['phone_number'] = '000000000'
    person['contact_info'] = contact_info
    people.append(person)

    person = dict()
    person['person_id'] = 'ID5678'
    person['name'] = 'Morgan Freeman'
    person['schedule'] = list()
    schedule = dict()
    schedule['schedule_id'] = 'SCHEDID2'
    schedule['started_at'] = '2022-12-26T02:00:00 02:00'
    schedule['ended_at'] = '2022-12-26T14:00:00 02:00'
    person['schedule'].append(schedule)
    contact_info = dict()
    contact_info['email'] = '[email protected]'
    contact_info['country_code'] = 1
    contact_info['phone_number'] = '000000000'
    person['contact_info'] = contact_info
    people.append(person)


    print(json.dumps(people, indent=4))

if __name__ == '__main__':
    main()

CodePudding user response:

I finally developed what I was looking for. A bit messy, but that does exactly what I need.

Thanks to @Robert Lee for the attempt, despite it was not what I chose to continue with.

class PersonData(object):
    def __init__(self, email, country_code, phone_number, user_id, names):
        self._email = email
        self._country_code = country_code
        self._phone_number = phone_number
        self._user_id = user_id
        self._names = names
        self._started = []
        self._ended = []
        self._schedule_id = []

    @property
    def email(self):
        return self._email

    @property
    def country_code(self):
        return self._country_code

    @property
    def phone_number(self):
        return self._phone_number

    @property
    def user_id(self):
        return self._user_id

    @property
    def names(self):
        return self._names

    @property
    def started(self):
        return self._started

    @started.setter
    def started(self, started):
        self._started.append(started)

    @started.deleter
    def started(self):
        del self._started

    @property
    def ended(self):
        return self._ended

    @ended.setter
    def ended(self, ended):
        self._ended.append(ended)

    @ended.deleter
    def ended(self):
        del self._ended

    @property
    def schedule_id(self):
        return self._schedule_id

    @schedule_id.setter
    def schedule_id(self, schedule_id):
        self._schedule_id.append(schedule_id)

    @schedule_id.deleter
    def schedule_id(self):
        del self._schedule_id


class PeopleBuffer(object):
    def __init__(self):
        self._people = []

    def find_by_id(self, email, country_code, phone_number, user_id, names):
        # search by id
        existing = [i for i in self._people if i.user_id == user_id]

        if not existing:
            # create and append if not found
            existing_person = PersonData(email, country_code, phone_number, user_id, names)
            self._people.append(existing_person)
        else:
            # assign to existing
            existing_person = existing[0]

        # return an object to be acted upon
        return existing_person

    def return_all(self):
        for each_person in self._people:
            print("each_person: ")
            print("Email: %s" % each_person.email)
            print("Country Code: %s" % each_person.country_code)
            print("Phone Number: %s" % each_person.phone_number)
            print("User Id: %s" % each_person.user_id)
            print("Names: %s" % each_person.names)
            print("Started: %s" % each_person.started)
            print("Ended: %s" % each_person.ended)
            print("ScheduleId: %s" % each_person.schedule_id)


class MainApplication(object):
    def __init__(self):
        self._buffer = PeopleBuffer()

    def _populate_person(self, email, country_code, phone_number, user_id, names, started, ended, schedule_id):
        person = self._buffer.find_by_id(email, country_code, phone_number, user_id, names)
        person.started.append(started)
        person.ended.append(ended)
        person.schedule_id.append(schedule_id)

    def _print_people(self):
        self._buffer.return_all()

    def main(self):

        while input("Continue? ") != "No":

            user_id = input("Enter UserId: ")
            names = input("Enter Name: ")
            started = input("Enter Started: ")
            ended = input("Enter Ended: ")
            schedule_id = input("Enter ScheduleId: ")
            email = input("Enter Email: ")
            country_code = input("Enter CountryCode: ")
            phone_number = input("Enter PhoneNumber: ")

            self._populate_person(email, country_code, phone_number, user_id, names, started, ended, schedule_id)

        self._print_people()


def main():
    app = MainApplication()
    app.main()


if __name__ == '__main__':
    main()
  • Related