# coding: utf-8

"""
    Seeq REST API

    No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)  # noqa: E501

    OpenAPI spec version: 66.0.0-v202409011703-CD
    
    Generated by: https://github.com/swagger-api/swagger-codegen.git
"""

from pprint import pformat
from six import iteritems
import re


class DatasourceSummaryStatusOutputV1(object):
    """
    NOTE: This class is auto generated by the swagger code generator program.
    Do not edit the class manually.
    """


    """
    Attributes:
      swagger_types (dict): The key is attribute name
                            and the value is attribute type.
      attribute_map (dict): The key is attribute name
                            and the value is json key in definition.
    """
    swagger_types = {
        'allow_requests': 'bool',
        'average_indexing_duration': 'int',
        'cache_enabled': 'bool',
        'connections': 'list[ConnectionStatusOutputV1]',
        'connections_connected_count': 'int',
        'current_index_at': 'str',
        'current_indexing_duration': 'int',
        'current_indexing_mode': 'str',
        'current_indexing_percentage': 'int',
        'current_indexing_started_at': 'str',
        'datasource_class': 'str',
        'datasource_id': 'str',
        'datasource_labels': 'str',
        'id': 'str',
        'indexing_schedule_supported': 'bool',
        'local_datasource': 'bool',
        'name': 'str',
        'next_scheduled_index_at': 'str',
        'placeholder': 'bool',
        'previous_index_at': 'str',
        'remaining_indexing_duration': 'int',
        'sync_progress': 'SyncProgressOutputV1',
        'sync_status': 'str',
        'total_connections_count': 'int'
    }

    attribute_map = {
        'allow_requests': 'allowRequests',
        'average_indexing_duration': 'averageIndexingDuration',
        'cache_enabled': 'cacheEnabled',
        'connections': 'connections',
        'connections_connected_count': 'connectionsConnectedCount',
        'current_index_at': 'currentIndexAt',
        'current_indexing_duration': 'currentIndexingDuration',
        'current_indexing_mode': 'currentIndexingMode',
        'current_indexing_percentage': 'currentIndexingPercentage',
        'current_indexing_started_at': 'currentIndexingStartedAt',
        'datasource_class': 'datasourceClass',
        'datasource_id': 'datasourceId',
        'datasource_labels': 'datasourceLabels',
        'id': 'id',
        'indexing_schedule_supported': 'indexingScheduleSupported',
        'local_datasource': 'localDatasource',
        'name': 'name',
        'next_scheduled_index_at': 'nextScheduledIndexAt',
        'placeholder': 'placeholder',
        'previous_index_at': 'previousIndexAt',
        'remaining_indexing_duration': 'remainingIndexingDuration',
        'sync_progress': 'syncProgress',
        'sync_status': 'syncStatus',
        'total_connections_count': 'totalConnectionsCount'
    }

    def __init__(self, allow_requests=False, average_indexing_duration=None, cache_enabled=False, connections=None, connections_connected_count=None, current_index_at=None, current_indexing_duration=None, current_indexing_mode=None, current_indexing_percentage=None, current_indexing_started_at=None, datasource_class=None, datasource_id=None, datasource_labels=None, id=None, indexing_schedule_supported=False, local_datasource=None, name=None, next_scheduled_index_at=None, placeholder=False, previous_index_at=None, remaining_indexing_duration=None, sync_progress=None, sync_status=None, total_connections_count=None):
        """
        DatasourceSummaryStatusOutputV1 - a model defined in Swagger
        """

        self._allow_requests = None
        self._average_indexing_duration = None
        self._cache_enabled = None
        self._connections = None
        self._connections_connected_count = None
        self._current_index_at = None
        self._current_indexing_duration = None
        self._current_indexing_mode = None
        self._current_indexing_percentage = None
        self._current_indexing_started_at = None
        self._datasource_class = None
        self._datasource_id = None
        self._datasource_labels = None
        self._id = None
        self._indexing_schedule_supported = None
        self._local_datasource = None
        self._name = None
        self._next_scheduled_index_at = None
        self._placeholder = None
        self._previous_index_at = None
        self._remaining_indexing_duration = None
        self._sync_progress = None
        self._sync_status = None
        self._total_connections_count = None

        if allow_requests is not None:
          self.allow_requests = allow_requests
        if average_indexing_duration is not None:
          self.average_indexing_duration = average_indexing_duration
        if cache_enabled is not None:
          self.cache_enabled = cache_enabled
        if connections is not None:
          self.connections = connections
        if connections_connected_count is not None:
          self.connections_connected_count = connections_connected_count
        if current_index_at is not None:
          self.current_index_at = current_index_at
        if current_indexing_duration is not None:
          self.current_indexing_duration = current_indexing_duration
        if current_indexing_mode is not None:
          self.current_indexing_mode = current_indexing_mode
        if current_indexing_percentage is not None:
          self.current_indexing_percentage = current_indexing_percentage
        if current_indexing_started_at is not None:
          self.current_indexing_started_at = current_indexing_started_at
        if datasource_class is not None:
          self.datasource_class = datasource_class
        if datasource_id is not None:
          self.datasource_id = datasource_id
        if datasource_labels is not None:
          self.datasource_labels = datasource_labels
        if id is not None:
          self.id = id
        if indexing_schedule_supported is not None:
          self.indexing_schedule_supported = indexing_schedule_supported
        if local_datasource is not None:
          self.local_datasource = local_datasource
        if name is not None:
          self.name = name
        if next_scheduled_index_at is not None:
          self.next_scheduled_index_at = next_scheduled_index_at
        if placeholder is not None:
          self.placeholder = placeholder
        if previous_index_at is not None:
          self.previous_index_at = previous_index_at
        if remaining_indexing_duration is not None:
          self.remaining_indexing_duration = remaining_indexing_duration
        if sync_progress is not None:
          self.sync_progress = sync_progress
        if sync_status is not None:
          self.sync_status = sync_status
        if total_connections_count is not None:
          self.total_connections_count = total_connections_count

    @property
    def allow_requests(self):
        """
        Gets the allow_requests of this DatasourceSummaryStatusOutputV1.
        Whether Seeq allows requests to the datasource

        :return: The allow_requests of this DatasourceSummaryStatusOutputV1.
        :rtype: bool
        """
        return self._allow_requests

    @allow_requests.setter
    def allow_requests(self, allow_requests):
        """
        Sets the allow_requests of this DatasourceSummaryStatusOutputV1.
        Whether Seeq allows requests to the datasource

        :param allow_requests: The allow_requests of this DatasourceSummaryStatusOutputV1.
        :type: bool
        """

        self._allow_requests = allow_requests

    @property
    def average_indexing_duration(self):
        """
        Gets the average_indexing_duration of this DatasourceSummaryStatusOutputV1.
        The duration in nanoseconds that indexing is expected to take, obtained via the average of the last 10 successful indexing durations, with null indicating no previous successful indexes

        :return: The average_indexing_duration of this DatasourceSummaryStatusOutputV1.
        :rtype: int
        """
        return self._average_indexing_duration

    @average_indexing_duration.setter
    def average_indexing_duration(self, average_indexing_duration):
        """
        Sets the average_indexing_duration of this DatasourceSummaryStatusOutputV1.
        The duration in nanoseconds that indexing is expected to take, obtained via the average of the last 10 successful indexing durations, with null indicating no previous successful indexes

        :param average_indexing_duration: The average_indexing_duration of this DatasourceSummaryStatusOutputV1.
        :type: int
        """

        self._average_indexing_duration = average_indexing_duration

    @property
    def cache_enabled(self):
        """
        Gets the cache_enabled of this DatasourceSummaryStatusOutputV1.
        Whether Cache is enabled for the datasource

        :return: The cache_enabled of this DatasourceSummaryStatusOutputV1.
        :rtype: bool
        """
        return self._cache_enabled

    @cache_enabled.setter
    def cache_enabled(self, cache_enabled):
        """
        Sets the cache_enabled of this DatasourceSummaryStatusOutputV1.
        Whether Cache is enabled for the datasource

        :param cache_enabled: The cache_enabled of this DatasourceSummaryStatusOutputV1.
        :type: bool
        """

        self._cache_enabled = cache_enabled

    @property
    def connections(self):
        """
        Gets the connections of this DatasourceSummaryStatusOutputV1.
        The status for each connection that provides data to this datasource. Provided only when the required level of detail is 'Complete'

        :return: The connections of this DatasourceSummaryStatusOutputV1.
        :rtype: list[ConnectionStatusOutputV1]
        """
        return self._connections

    @connections.setter
    def connections(self, connections):
        """
        Sets the connections of this DatasourceSummaryStatusOutputV1.
        The status for each connection that provides data to this datasource. Provided only when the required level of detail is 'Complete'

        :param connections: The connections of this DatasourceSummaryStatusOutputV1.
        :type: list[ConnectionStatusOutputV1]
        """

        self._connections = connections

    @property
    def connections_connected_count(self):
        """
        Gets the connections_connected_count of this DatasourceSummaryStatusOutputV1.
        Number of connections in status 'Connected' providing data for this datasource

        :return: The connections_connected_count of this DatasourceSummaryStatusOutputV1.
        :rtype: int
        """
        return self._connections_connected_count

    @connections_connected_count.setter
    def connections_connected_count(self, connections_connected_count):
        """
        Sets the connections_connected_count of this DatasourceSummaryStatusOutputV1.
        Number of connections in status 'Connected' providing data for this datasource

        :param connections_connected_count: The connections_connected_count of this DatasourceSummaryStatusOutputV1.
        :type: int
        """

        self._connections_connected_count = connections_connected_count

    @property
    def current_index_at(self):
        """
        Gets the current_index_at of this DatasourceSummaryStatusOutputV1.
        The ISO 8601 date of when current index occurred (YYYY-MM-DDThh:mm:ss.sssssssss±hh:mm)

        :return: The current_index_at of this DatasourceSummaryStatusOutputV1.
        :rtype: str
        """
        return self._current_index_at

    @current_index_at.setter
    def current_index_at(self, current_index_at):
        """
        Sets the current_index_at of this DatasourceSummaryStatusOutputV1.
        The ISO 8601 date of when current index occurred (YYYY-MM-DDThh:mm:ss.sssssssss±hh:mm)

        :param current_index_at: The current_index_at of this DatasourceSummaryStatusOutputV1.
        :type: str
        """

        self._current_index_at = current_index_at

    @property
    def current_indexing_duration(self):
        """
        Gets the current_indexing_duration of this DatasourceSummaryStatusOutputV1.
        The duration in nanoseconds from when indexing started to the present time, if indexing is currently occurring

        :return: The current_indexing_duration of this DatasourceSummaryStatusOutputV1.
        :rtype: int
        """
        return self._current_indexing_duration

    @current_indexing_duration.setter
    def current_indexing_duration(self, current_indexing_duration):
        """
        Sets the current_indexing_duration of this DatasourceSummaryStatusOutputV1.
        The duration in nanoseconds from when indexing started to the present time, if indexing is currently occurring

        :param current_indexing_duration: The current_indexing_duration of this DatasourceSummaryStatusOutputV1.
        :type: int
        """

        self._current_indexing_duration = current_indexing_duration

    @property
    def current_indexing_mode(self):
        """
        Gets the current_indexing_mode of this DatasourceSummaryStatusOutputV1.
        The mode of the current indexing (FULL or INCREMENTAL)

        :return: The current_indexing_mode of this DatasourceSummaryStatusOutputV1.
        :rtype: str
        """
        return self._current_indexing_mode

    @current_indexing_mode.setter
    def current_indexing_mode(self, current_indexing_mode):
        """
        Sets the current_indexing_mode of this DatasourceSummaryStatusOutputV1.
        The mode of the current indexing (FULL or INCREMENTAL)

        :param current_indexing_mode: The current_indexing_mode of this DatasourceSummaryStatusOutputV1.
        :type: str
        """

        self._current_indexing_mode = current_indexing_mode

    @property
    def current_indexing_percentage(self):
        """
        Gets the current_indexing_percentage of this DatasourceSummaryStatusOutputV1.
        The ratio of currentIndexingDuration to averageIndexingDuration, expressed as a percentage and rounded to the nearest integer

        :return: The current_indexing_percentage of this DatasourceSummaryStatusOutputV1.
        :rtype: int
        """
        return self._current_indexing_percentage

    @current_indexing_percentage.setter
    def current_indexing_percentage(self, current_indexing_percentage):
        """
        Sets the current_indexing_percentage of this DatasourceSummaryStatusOutputV1.
        The ratio of currentIndexingDuration to averageIndexingDuration, expressed as a percentage and rounded to the nearest integer

        :param current_indexing_percentage: The current_indexing_percentage of this DatasourceSummaryStatusOutputV1.
        :type: int
        """

        self._current_indexing_percentage = current_indexing_percentage

    @property
    def current_indexing_started_at(self):
        """
        Gets the current_indexing_started_at of this DatasourceSummaryStatusOutputV1.
        The ISO 8601 date of when the current indexing started, if indexing is currently occurring (YYYY-MM-DDThh:mm:ss.sssssssss±hh:mm)

        :return: The current_indexing_started_at of this DatasourceSummaryStatusOutputV1.
        :rtype: str
        """
        return self._current_indexing_started_at

    @current_indexing_started_at.setter
    def current_indexing_started_at(self, current_indexing_started_at):
        """
        Sets the current_indexing_started_at of this DatasourceSummaryStatusOutputV1.
        The ISO 8601 date of when the current indexing started, if indexing is currently occurring (YYYY-MM-DDThh:mm:ss.sssssssss±hh:mm)

        :param current_indexing_started_at: The current_indexing_started_at of this DatasourceSummaryStatusOutputV1.
        :type: str
        """

        self._current_indexing_started_at = current_indexing_started_at

    @property
    def datasource_class(self):
        """
        Gets the datasource_class of this DatasourceSummaryStatusOutputV1.
        The datasource class.  Example: OSIsoft PI

        :return: The datasource_class of this DatasourceSummaryStatusOutputV1.
        :rtype: str
        """
        return self._datasource_class

    @datasource_class.setter
    def datasource_class(self, datasource_class):
        """
        Sets the datasource_class of this DatasourceSummaryStatusOutputV1.
        The datasource class.  Example: OSIsoft PI

        :param datasource_class: The datasource_class of this DatasourceSummaryStatusOutputV1.
        :type: str
        """
        if datasource_class is None:
            raise ValueError("Invalid value for `datasource_class`, must not be `None`")

        self._datasource_class = datasource_class

    @property
    def datasource_id(self):
        """
        Gets the datasource_id of this DatasourceSummaryStatusOutputV1.
        The datasource ID

        :return: The datasource_id of this DatasourceSummaryStatusOutputV1.
        :rtype: str
        """
        return self._datasource_id

    @datasource_id.setter
    def datasource_id(self, datasource_id):
        """
        Sets the datasource_id of this DatasourceSummaryStatusOutputV1.
        The datasource ID

        :param datasource_id: The datasource_id of this DatasourceSummaryStatusOutputV1.
        :type: str
        """
        if datasource_id is None:
            raise ValueError("Invalid value for `datasource_id`, must not be `None`")

        self._datasource_id = datasource_id

    @property
    def datasource_labels(self):
        """
        Gets the datasource_labels of this DatasourceSummaryStatusOutputV1.
        Labels used for filtering datasources in the admin interface

        :return: The datasource_labels of this DatasourceSummaryStatusOutputV1.
        :rtype: str
        """
        return self._datasource_labels

    @datasource_labels.setter
    def datasource_labels(self, datasource_labels):
        """
        Sets the datasource_labels of this DatasourceSummaryStatusOutputV1.
        Labels used for filtering datasources in the admin interface

        :param datasource_labels: The datasource_labels of this DatasourceSummaryStatusOutputV1.
        :type: str
        """

        self._datasource_labels = datasource_labels

    @property
    def id(self):
        """
        Gets the id of this DatasourceSummaryStatusOutputV1.
        The Seeq ID of the datasource

        :return: The id of this DatasourceSummaryStatusOutputV1.
        :rtype: str
        """
        return self._id

    @id.setter
    def id(self, id):
        """
        Sets the id of this DatasourceSummaryStatusOutputV1.
        The Seeq ID of the datasource

        :param id: The id of this DatasourceSummaryStatusOutputV1.
        :type: str
        """
        if id is None:
            raise ValueError("Invalid value for `id`, must not be `None`")

        self._id = id

    @property
    def indexing_schedule_supported(self):
        """
        Gets the indexing_schedule_supported of this DatasourceSummaryStatusOutputV1.
        Whether indexing schedule is supported for the datasource

        :return: The indexing_schedule_supported of this DatasourceSummaryStatusOutputV1.
        :rtype: bool
        """
        return self._indexing_schedule_supported

    @indexing_schedule_supported.setter
    def indexing_schedule_supported(self, indexing_schedule_supported):
        """
        Sets the indexing_schedule_supported of this DatasourceSummaryStatusOutputV1.
        Whether indexing schedule is supported for the datasource

        :param indexing_schedule_supported: The indexing_schedule_supported of this DatasourceSummaryStatusOutputV1.
        :type: bool
        """

        self._indexing_schedule_supported = indexing_schedule_supported

    @property
    def local_datasource(self):
        """
        Gets the local_datasource of this DatasourceSummaryStatusOutputV1.
        Whether the datasource is a local datasource

        :return: The local_datasource of this DatasourceSummaryStatusOutputV1.
        :rtype: bool
        """
        return self._local_datasource

    @local_datasource.setter
    def local_datasource(self, local_datasource):
        """
        Sets the local_datasource of this DatasourceSummaryStatusOutputV1.
        Whether the datasource is a local datasource

        :param local_datasource: The local_datasource of this DatasourceSummaryStatusOutputV1.
        :type: bool
        """

        self._local_datasource = local_datasource

    @property
    def name(self):
        """
        Gets the name of this DatasourceSummaryStatusOutputV1.
        The name of the datasource

        :return: The name of this DatasourceSummaryStatusOutputV1.
        :rtype: str
        """
        return self._name

    @name.setter
    def name(self, name):
        """
        Sets the name of this DatasourceSummaryStatusOutputV1.
        The name of the datasource

        :param name: The name of this DatasourceSummaryStatusOutputV1.
        :type: str
        """
        if name is None:
            raise ValueError("Invalid value for `name`, must not be `None`")

        self._name = name

    @property
    def next_scheduled_index_at(self):
        """
        Gets the next_scheduled_index_at of this DatasourceSummaryStatusOutputV1.
        The ISO 8601 date of when next indexing is scheduled (YYYY-MM-DDThh:mm:ss.sssssssss±hh:mm)

        :return: The next_scheduled_index_at of this DatasourceSummaryStatusOutputV1.
        :rtype: str
        """
        return self._next_scheduled_index_at

    @next_scheduled_index_at.setter
    def next_scheduled_index_at(self, next_scheduled_index_at):
        """
        Sets the next_scheduled_index_at of this DatasourceSummaryStatusOutputV1.
        The ISO 8601 date of when next indexing is scheduled (YYYY-MM-DDThh:mm:ss.sssssssss±hh:mm)

        :param next_scheduled_index_at: The next_scheduled_index_at of this DatasourceSummaryStatusOutputV1.
        :type: str
        """

        self._next_scheduled_index_at = next_scheduled_index_at

    @property
    def placeholder(self):
        """
        Gets the placeholder of this DatasourceSummaryStatusOutputV1.
        Whether this is a placeholder datasource created for a connection without datasource

        :return: The placeholder of this DatasourceSummaryStatusOutputV1.
        :rtype: bool
        """
        return self._placeholder

    @placeholder.setter
    def placeholder(self, placeholder):
        """
        Sets the placeholder of this DatasourceSummaryStatusOutputV1.
        Whether this is a placeholder datasource created for a connection without datasource

        :param placeholder: The placeholder of this DatasourceSummaryStatusOutputV1.
        :type: bool
        """

        self._placeholder = placeholder

    @property
    def previous_index_at(self):
        """
        Gets the previous_index_at of this DatasourceSummaryStatusOutputV1.
        The ISO 8601 date of when previous index occurred (YYYY-MM-DDThh:mm:ss.sssssssss±hh:mm)

        :return: The previous_index_at of this DatasourceSummaryStatusOutputV1.
        :rtype: str
        """
        return self._previous_index_at

    @previous_index_at.setter
    def previous_index_at(self, previous_index_at):
        """
        Sets the previous_index_at of this DatasourceSummaryStatusOutputV1.
        The ISO 8601 date of when previous index occurred (YYYY-MM-DDThh:mm:ss.sssssssss±hh:mm)

        :param previous_index_at: The previous_index_at of this DatasourceSummaryStatusOutputV1.
        :type: str
        """

        self._previous_index_at = previous_index_at

    @property
    def remaining_indexing_duration(self):
        """
        Gets the remaining_indexing_duration of this DatasourceSummaryStatusOutputV1.
        The difference between averageIndexingDuration and currentIndexingDuration, expressed in nanoseconds

        :return: The remaining_indexing_duration of this DatasourceSummaryStatusOutputV1.
        :rtype: int
        """
        return self._remaining_indexing_duration

    @remaining_indexing_duration.setter
    def remaining_indexing_duration(self, remaining_indexing_duration):
        """
        Sets the remaining_indexing_duration of this DatasourceSummaryStatusOutputV1.
        The difference between averageIndexingDuration and currentIndexingDuration, expressed in nanoseconds

        :param remaining_indexing_duration: The remaining_indexing_duration of this DatasourceSummaryStatusOutputV1.
        :type: int
        """

        self._remaining_indexing_duration = remaining_indexing_duration

    @property
    def sync_progress(self):
        """
        Gets the sync_progress of this DatasourceSummaryStatusOutputV1.

        :return: The sync_progress of this DatasourceSummaryStatusOutputV1.
        :rtype: SyncProgressOutputV1
        """
        return self._sync_progress

    @sync_progress.setter
    def sync_progress(self, sync_progress):
        """
        Sets the sync_progress of this DatasourceSummaryStatusOutputV1.

        :param sync_progress: The sync_progress of this DatasourceSummaryStatusOutputV1.
        :type: SyncProgressOutputV1
        """

        self._sync_progress = sync_progress

    @property
    def sync_status(self):
        """
        Gets the sync_status of this DatasourceSummaryStatusOutputV1.
        The aggregate synchronization status of the connections for this datasource

        :return: The sync_status of this DatasourceSummaryStatusOutputV1.
        :rtype: str
        """
        return self._sync_status

    @sync_status.setter
    def sync_status(self, sync_status):
        """
        Sets the sync_status of this DatasourceSummaryStatusOutputV1.
        The aggregate synchronization status of the connections for this datasource

        :param sync_status: The sync_status of this DatasourceSummaryStatusOutputV1.
        :type: str
        """
        allowed_values = ["SYNC_ARCHIVING_DELETED_ITEMS", "SYNC_IN_PROGRESS", "SYNC_INITIALIZING", "SYNC_SUCCESS", "SYNC_COMPLETE", "SYNC_FAILED", "SYNC_UNKNOWN"]
        if sync_status not in allowed_values:
            raise ValueError(
                "Invalid value for `sync_status` ({0}), must be one of {1}"
                .format(sync_status, allowed_values)
            )

        self._sync_status = sync_status

    @property
    def total_connections_count(self):
        """
        Gets the total_connections_count of this DatasourceSummaryStatusOutputV1.
        The total number of connections that should be in status 'Connected' for this datasource

        :return: The total_connections_count of this DatasourceSummaryStatusOutputV1.
        :rtype: int
        """
        return self._total_connections_count

    @total_connections_count.setter
    def total_connections_count(self, total_connections_count):
        """
        Sets the total_connections_count of this DatasourceSummaryStatusOutputV1.
        The total number of connections that should be in status 'Connected' for this datasource

        :param total_connections_count: The total_connections_count of this DatasourceSummaryStatusOutputV1.
        :type: int
        """

        self._total_connections_count = total_connections_count

    def to_dict(self):
        """
        Returns the model properties as a dict
        """
        result = {}

        for attr, _ in iteritems(self.swagger_types):
            value = getattr(self, attr)
            if isinstance(value, list):
                result[attr] = list(map(
                    lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
                    value
                ))
            elif hasattr(value, "to_dict"):
                result[attr] = value.to_dict()
            elif isinstance(value, dict):
                result[attr] = dict(map(
                    lambda item: (item[0], item[1].to_dict())
                    if hasattr(item[1], "to_dict") else item,
                    value.items()
                ))
            else:
                result[attr] = value

        return result

    def to_str(self):
        """
        Returns the string representation of the model
        """
        return pformat(self.to_dict())

    def __repr__(self):
        """
        For `print` and `pprint`
        """
        return self.to_str()

    def __eq__(self, other):
        """
        Returns true if both objects are equal
        """
        if not isinstance(other, DatasourceSummaryStatusOutputV1):
            return False

        return self.__dict__ == other.__dict__

    def __ne__(self, other):
        """
        Returns true if both objects are not equal
        """
        return not self == other
