1# coding: utf-8
2# Copyright (c) 2016, 2021, Oracle and/or its affiliates.  All rights reserved.
3# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
4
5
6from oci.util import formatted_flat_dict, NONE_SENTINEL, value_allowed_none_or_none_sentinel  # noqa: F401
7from oci.decorators import init_model_state_from_kwargs
8
9
10@init_model_state_from_kwargs
11class WafLog(object):
12    """
13    A list of Web Application Firewall log entries. Each entry is a JSON object, including a timestamp property and other fields varying based on log type. Logs record what rules and countermeasures are triggered by requests and are used as a basis to move request handling into block mode. For more information about WAF logs, see `Logs`__.
14
15    __ https://docs.cloud.oracle.com/iaas/Content/WAF/Tasks/logs.htm
16    """
17
18    def __init__(self, **kwargs):
19        """
20        Initializes a new WafLog object with values from keyword arguments.
21        The following keyword arguments are supported (corresponding to the getters/setters of this class):
22
23        :param action:
24            The value to assign to the action property of this WafLog.
25        :type action: str
26
27        :param captcha_action:
28            The value to assign to the captcha_action property of this WafLog.
29        :type captcha_action: str
30
31        :param captcha_expected:
32            The value to assign to the captcha_expected property of this WafLog.
33        :type captcha_expected: str
34
35        :param captcha_received:
36            The value to assign to the captcha_received property of this WafLog.
37        :type captcha_received: str
38
39        :param captcha_fail_count:
40            The value to assign to the captcha_fail_count property of this WafLog.
41        :type captcha_fail_count: str
42
43        :param client_address:
44            The value to assign to the client_address property of this WafLog.
45        :type client_address: str
46
47        :param country_name:
48            The value to assign to the country_name property of this WafLog.
49        :type country_name: str
50
51        :param user_agent:
52            The value to assign to the user_agent property of this WafLog.
53        :type user_agent: str
54
55        :param domain:
56            The value to assign to the domain property of this WafLog.
57        :type domain: str
58
59        :param protection_rule_detections:
60            The value to assign to the protection_rule_detections property of this WafLog.
61        :type protection_rule_detections: dict(str, str)
62
63        :param http_method:
64            The value to assign to the http_method property of this WafLog.
65        :type http_method: str
66
67        :param request_url:
68            The value to assign to the request_url property of this WafLog.
69        :type request_url: str
70
71        :param http_headers:
72            The value to assign to the http_headers property of this WafLog.
73        :type http_headers: dict(str, str)
74
75        :param referrer:
76            The value to assign to the referrer property of this WafLog.
77        :type referrer: str
78
79        :param response_code:
80            The value to assign to the response_code property of this WafLog.
81        :type response_code: int
82
83        :param response_size:
84            The value to assign to the response_size property of this WafLog.
85        :type response_size: int
86
87        :param incident_key:
88            The value to assign to the incident_key property of this WafLog.
89        :type incident_key: str
90
91        :param fingerprint:
92            The value to assign to the fingerprint property of this WafLog.
93        :type fingerprint: str
94
95        :param device:
96            The value to assign to the device property of this WafLog.
97        :type device: str
98
99        :param country_code:
100            The value to assign to the country_code property of this WafLog.
101        :type country_code: str
102
103        :param request_headers:
104            The value to assign to the request_headers property of this WafLog.
105        :type request_headers: dict(str, str)
106
107        :param threat_feed_key:
108            The value to assign to the threat_feed_key property of this WafLog.
109        :type threat_feed_key: str
110
111        :param access_rule_key:
112            The value to assign to the access_rule_key property of this WafLog.
113        :type access_rule_key: str
114
115        :param address_rate_limiting_key:
116            The value to assign to the address_rate_limiting_key property of this WafLog.
117        :type address_rate_limiting_key: str
118
119        :param timestamp:
120            The value to assign to the timestamp property of this WafLog.
121        :type timestamp: datetime
122
123        :param log_type:
124            The value to assign to the log_type property of this WafLog.
125        :type log_type: str
126
127        :param origin_address:
128            The value to assign to the origin_address property of this WafLog.
129        :type origin_address: str
130
131        :param origin_response_time:
132            The value to assign to the origin_response_time property of this WafLog.
133        :type origin_response_time: str
134
135        """
136        self.swagger_types = {
137            'action': 'str',
138            'captcha_action': 'str',
139            'captcha_expected': 'str',
140            'captcha_received': 'str',
141            'captcha_fail_count': 'str',
142            'client_address': 'str',
143            'country_name': 'str',
144            'user_agent': 'str',
145            'domain': 'str',
146            'protection_rule_detections': 'dict(str, str)',
147            'http_method': 'str',
148            'request_url': 'str',
149            'http_headers': 'dict(str, str)',
150            'referrer': 'str',
151            'response_code': 'int',
152            'response_size': 'int',
153            'incident_key': 'str',
154            'fingerprint': 'str',
155            'device': 'str',
156            'country_code': 'str',
157            'request_headers': 'dict(str, str)',
158            'threat_feed_key': 'str',
159            'access_rule_key': 'str',
160            'address_rate_limiting_key': 'str',
161            'timestamp': 'datetime',
162            'log_type': 'str',
163            'origin_address': 'str',
164            'origin_response_time': 'str'
165        }
166
167        self.attribute_map = {
168            'action': 'action',
169            'captcha_action': 'captchaAction',
170            'captcha_expected': 'captchaExpected',
171            'captcha_received': 'captchaReceived',
172            'captcha_fail_count': 'captchaFailCount',
173            'client_address': 'clientAddress',
174            'country_name': 'countryName',
175            'user_agent': 'userAgent',
176            'domain': 'domain',
177            'protection_rule_detections': 'protectionRuleDetections',
178            'http_method': 'httpMethod',
179            'request_url': 'requestUrl',
180            'http_headers': 'httpHeaders',
181            'referrer': 'referrer',
182            'response_code': 'responseCode',
183            'response_size': 'responseSize',
184            'incident_key': 'incidentKey',
185            'fingerprint': 'fingerprint',
186            'device': 'device',
187            'country_code': 'countryCode',
188            'request_headers': 'requestHeaders',
189            'threat_feed_key': 'threatFeedKey',
190            'access_rule_key': 'accessRuleKey',
191            'address_rate_limiting_key': 'addressRateLimitingKey',
192            'timestamp': 'timestamp',
193            'log_type': 'logType',
194            'origin_address': 'originAddress',
195            'origin_response_time': 'originResponseTime'
196        }
197
198        self._action = None
199        self._captcha_action = None
200        self._captcha_expected = None
201        self._captcha_received = None
202        self._captcha_fail_count = None
203        self._client_address = None
204        self._country_name = None
205        self._user_agent = None
206        self._domain = None
207        self._protection_rule_detections = None
208        self._http_method = None
209        self._request_url = None
210        self._http_headers = None
211        self._referrer = None
212        self._response_code = None
213        self._response_size = None
214        self._incident_key = None
215        self._fingerprint = None
216        self._device = None
217        self._country_code = None
218        self._request_headers = None
219        self._threat_feed_key = None
220        self._access_rule_key = None
221        self._address_rate_limiting_key = None
222        self._timestamp = None
223        self._log_type = None
224        self._origin_address = None
225        self._origin_response_time = None
226
227    @property
228    def action(self):
229        """
230        Gets the action of this WafLog.
231        The action taken on the request, either `ALLOW`, `DETECT`, or `BLOCK`.
232
233
234        :return: The action of this WafLog.
235        :rtype: str
236        """
237        return self._action
238
239    @action.setter
240    def action(self, action):
241        """
242        Sets the action of this WafLog.
243        The action taken on the request, either `ALLOW`, `DETECT`, or `BLOCK`.
244
245
246        :param action: The action of this WafLog.
247        :type: str
248        """
249        self._action = action
250
251    @property
252    def captcha_action(self):
253        """
254        Gets the captcha_action of this WafLog.
255        The CAPTCHA action taken on the request, `ALLOW` or `BLOCK`. For more information about
256        CAPTCHAs, see `UpdateCaptchas`.
257
258
259        :return: The captcha_action of this WafLog.
260        :rtype: str
261        """
262        return self._captcha_action
263
264    @captcha_action.setter
265    def captcha_action(self, captcha_action):
266        """
267        Sets the captcha_action of this WafLog.
268        The CAPTCHA action taken on the request, `ALLOW` or `BLOCK`. For more information about
269        CAPTCHAs, see `UpdateCaptchas`.
270
271
272        :param captcha_action: The captcha_action of this WafLog.
273        :type: str
274        """
275        self._captcha_action = captcha_action
276
277    @property
278    def captcha_expected(self):
279        """
280        Gets the captcha_expected of this WafLog.
281        The CAPTCHA challenge answer that was expected.
282
283
284        :return: The captcha_expected of this WafLog.
285        :rtype: str
286        """
287        return self._captcha_expected
288
289    @captcha_expected.setter
290    def captcha_expected(self, captcha_expected):
291        """
292        Sets the captcha_expected of this WafLog.
293        The CAPTCHA challenge answer that was expected.
294
295
296        :param captcha_expected: The captcha_expected of this WafLog.
297        :type: str
298        """
299        self._captcha_expected = captcha_expected
300
301    @property
302    def captcha_received(self):
303        """
304        Gets the captcha_received of this WafLog.
305        The CAPTCHA challenge answer that was received.
306
307
308        :return: The captcha_received of this WafLog.
309        :rtype: str
310        """
311        return self._captcha_received
312
313    @captcha_received.setter
314    def captcha_received(self, captcha_received):
315        """
316        Sets the captcha_received of this WafLog.
317        The CAPTCHA challenge answer that was received.
318
319
320        :param captcha_received: The captcha_received of this WafLog.
321        :type: str
322        """
323        self._captcha_received = captcha_received
324
325    @property
326    def captcha_fail_count(self):
327        """
328        Gets the captcha_fail_count of this WafLog.
329        The number of times the CAPTCHA challenge was failed.
330
331
332        :return: The captcha_fail_count of this WafLog.
333        :rtype: str
334        """
335        return self._captcha_fail_count
336
337    @captcha_fail_count.setter
338    def captcha_fail_count(self, captcha_fail_count):
339        """
340        Sets the captcha_fail_count of this WafLog.
341        The number of times the CAPTCHA challenge was failed.
342
343
344        :param captcha_fail_count: The captcha_fail_count of this WafLog.
345        :type: str
346        """
347        self._captcha_fail_count = captcha_fail_count
348
349    @property
350    def client_address(self):
351        """
352        Gets the client_address of this WafLog.
353        The IPv4 address of the requesting client.
354
355
356        :return: The client_address of this WafLog.
357        :rtype: str
358        """
359        return self._client_address
360
361    @client_address.setter
362    def client_address(self, client_address):
363        """
364        Sets the client_address of this WafLog.
365        The IPv4 address of the requesting client.
366
367
368        :param client_address: The client_address of this WafLog.
369        :type: str
370        """
371        self._client_address = client_address
372
373    @property
374    def country_name(self):
375        """
376        Gets the country_name of this WafLog.
377        The name of the country where the request originated.
378
379
380        :return: The country_name of this WafLog.
381        :rtype: str
382        """
383        return self._country_name
384
385    @country_name.setter
386    def country_name(self, country_name):
387        """
388        Sets the country_name of this WafLog.
389        The name of the country where the request originated.
390
391
392        :param country_name: The country_name of this WafLog.
393        :type: str
394        """
395        self._country_name = country_name
396
397    @property
398    def user_agent(self):
399        """
400        Gets the user_agent of this WafLog.
401        The value of the request's `User-Agent` header field.
402
403
404        :return: The user_agent of this WafLog.
405        :rtype: str
406        """
407        return self._user_agent
408
409    @user_agent.setter
410    def user_agent(self, user_agent):
411        """
412        Sets the user_agent of this WafLog.
413        The value of the request's `User-Agent` header field.
414
415
416        :param user_agent: The user_agent of this WafLog.
417        :type: str
418        """
419        self._user_agent = user_agent
420
421    @property
422    def domain(self):
423        """
424        Gets the domain of this WafLog.
425        The `Host` header data of the request.
426
427
428        :return: The domain of this WafLog.
429        :rtype: str
430        """
431        return self._domain
432
433    @domain.setter
434    def domain(self, domain):
435        """
436        Sets the domain of this WafLog.
437        The `Host` header data of the request.
438
439
440        :param domain: The domain of this WafLog.
441        :type: str
442        """
443        self._domain = domain
444
445    @property
446    def protection_rule_detections(self):
447        """
448        Gets the protection_rule_detections of this WafLog.
449        A map of protection rule keys to detection message details. Detections are
450        requests that matched the criteria of a protection rule but the rule's
451        action was set to `DETECT`.
452
453
454        :return: The protection_rule_detections of this WafLog.
455        :rtype: dict(str, str)
456        """
457        return self._protection_rule_detections
458
459    @protection_rule_detections.setter
460    def protection_rule_detections(self, protection_rule_detections):
461        """
462        Sets the protection_rule_detections of this WafLog.
463        A map of protection rule keys to detection message details. Detections are
464        requests that matched the criteria of a protection rule but the rule's
465        action was set to `DETECT`.
466
467
468        :param protection_rule_detections: The protection_rule_detections of this WafLog.
469        :type: dict(str, str)
470        """
471        self._protection_rule_detections = protection_rule_detections
472
473    @property
474    def http_method(self):
475        """
476        Gets the http_method of this WafLog.
477        The HTTP method of the request.
478
479
480        :return: The http_method of this WafLog.
481        :rtype: str
482        """
483        return self._http_method
484
485    @http_method.setter
486    def http_method(self, http_method):
487        """
488        Sets the http_method of this WafLog.
489        The HTTP method of the request.
490
491
492        :param http_method: The http_method of this WafLog.
493        :type: str
494        """
495        self._http_method = http_method
496
497    @property
498    def request_url(self):
499        """
500        Gets the request_url of this WafLog.
501        The path and query string of the request.
502
503
504        :return: The request_url of this WafLog.
505        :rtype: str
506        """
507        return self._request_url
508
509    @request_url.setter
510    def request_url(self, request_url):
511        """
512        Sets the request_url of this WafLog.
513        The path and query string of the request.
514
515
516        :param request_url: The request_url of this WafLog.
517        :type: str
518        """
519        self._request_url = request_url
520
521    @property
522    def http_headers(self):
523        """
524        Gets the http_headers of this WafLog.
525        The map of the request's header names to their respective values.
526
527
528        :return: The http_headers of this WafLog.
529        :rtype: dict(str, str)
530        """
531        return self._http_headers
532
533    @http_headers.setter
534    def http_headers(self, http_headers):
535        """
536        Sets the http_headers of this WafLog.
537        The map of the request's header names to their respective values.
538
539
540        :param http_headers: The http_headers of this WafLog.
541        :type: dict(str, str)
542        """
543        self._http_headers = http_headers
544
545    @property
546    def referrer(self):
547        """
548        Gets the referrer of this WafLog.
549        The `Referrer` header value of the request.
550
551
552        :return: The referrer of this WafLog.
553        :rtype: str
554        """
555        return self._referrer
556
557    @referrer.setter
558    def referrer(self, referrer):
559        """
560        Sets the referrer of this WafLog.
561        The `Referrer` header value of the request.
562
563
564        :param referrer: The referrer of this WafLog.
565        :type: str
566        """
567        self._referrer = referrer
568
569    @property
570    def response_code(self):
571        """
572        Gets the response_code of this WafLog.
573        The status code of the response.
574
575
576        :return: The response_code of this WafLog.
577        :rtype: int
578        """
579        return self._response_code
580
581    @response_code.setter
582    def response_code(self, response_code):
583        """
584        Sets the response_code of this WafLog.
585        The status code of the response.
586
587
588        :param response_code: The response_code of this WafLog.
589        :type: int
590        """
591        self._response_code = response_code
592
593    @property
594    def response_size(self):
595        """
596        Gets the response_size of this WafLog.
597        The size in bytes of the response.
598
599
600        :return: The response_size of this WafLog.
601        :rtype: int
602        """
603        return self._response_size
604
605    @response_size.setter
606    def response_size(self, response_size):
607        """
608        Sets the response_size of this WafLog.
609        The size in bytes of the response.
610
611
612        :param response_size: The response_size of this WafLog.
613        :type: int
614        """
615        self._response_size = response_size
616
617    @property
618    def incident_key(self):
619        """
620        Gets the incident_key of this WafLog.
621        The incident key of a request. An incident key is generated for
622        each request processed by the Web Application Firewall and is used to
623        idenitfy blocked requests in applicable logs.
624
625
626        :return: The incident_key of this WafLog.
627        :rtype: str
628        """
629        return self._incident_key
630
631    @incident_key.setter
632    def incident_key(self, incident_key):
633        """
634        Sets the incident_key of this WafLog.
635        The incident key of a request. An incident key is generated for
636        each request processed by the Web Application Firewall and is used to
637        idenitfy blocked requests in applicable logs.
638
639
640        :param incident_key: The incident_key of this WafLog.
641        :type: str
642        """
643        self._incident_key = incident_key
644
645    @property
646    def fingerprint(self):
647        """
648        Gets the fingerprint of this WafLog.
649        The hashed signature of the device's fingerprint. For more information,
650        see `DeviceFingerPrintChallenge`.
651
652
653        :return: The fingerprint of this WafLog.
654        :rtype: str
655        """
656        return self._fingerprint
657
658    @fingerprint.setter
659    def fingerprint(self, fingerprint):
660        """
661        Sets the fingerprint of this WafLog.
662        The hashed signature of the device's fingerprint. For more information,
663        see `DeviceFingerPrintChallenge`.
664
665
666        :param fingerprint: The fingerprint of this WafLog.
667        :type: str
668        """
669        self._fingerprint = fingerprint
670
671    @property
672    def device(self):
673        """
674        Gets the device of this WafLog.
675        The type of device that the request was made from.
676
677
678        :return: The device of this WafLog.
679        :rtype: str
680        """
681        return self._device
682
683    @device.setter
684    def device(self, device):
685        """
686        Sets the device of this WafLog.
687        The type of device that the request was made from.
688
689
690        :param device: The device of this WafLog.
691        :type: str
692        """
693        self._device = device
694
695    @property
696    def country_code(self):
697        """
698        Gets the country_code of this WafLog.
699        ISO 3166-1 alpha-2 code of the country from which the request originated.
700        For a list of codes, see `ISO's website`__.
701
702        __ https://www.iso.org/obp/ui/#search/code/
703
704
705        :return: The country_code of this WafLog.
706        :rtype: str
707        """
708        return self._country_code
709
710    @country_code.setter
711    def country_code(self, country_code):
712        """
713        Sets the country_code of this WafLog.
714        ISO 3166-1 alpha-2 code of the country from which the request originated.
715        For a list of codes, see `ISO's website`__.
716
717        __ https://www.iso.org/obp/ui/#search/code/
718
719
720        :param country_code: The country_code of this WafLog.
721        :type: str
722        """
723        self._country_code = country_code
724
725    @property
726    def request_headers(self):
727        """
728        Gets the request_headers of this WafLog.
729        A map of header names to values of the request sent to the origin, including any headers
730        appended by the Web Application Firewall.
731
732
733        :return: The request_headers of this WafLog.
734        :rtype: dict(str, str)
735        """
736        return self._request_headers
737
738    @request_headers.setter
739    def request_headers(self, request_headers):
740        """
741        Sets the request_headers of this WafLog.
742        A map of header names to values of the request sent to the origin, including any headers
743        appended by the Web Application Firewall.
744
745
746        :param request_headers: The request_headers of this WafLog.
747        :type: dict(str, str)
748        """
749        self._request_headers = request_headers
750
751    @property
752    def threat_feed_key(self):
753        """
754        Gets the threat_feed_key of this WafLog.
755        The `ThreatFeed` key that matched the request. For more information about
756        threat feeds, see `UpdateThreatFeeds`.
757
758
759        :return: The threat_feed_key of this WafLog.
760        :rtype: str
761        """
762        return self._threat_feed_key
763
764    @threat_feed_key.setter
765    def threat_feed_key(self, threat_feed_key):
766        """
767        Sets the threat_feed_key of this WafLog.
768        The `ThreatFeed` key that matched the request. For more information about
769        threat feeds, see `UpdateThreatFeeds`.
770
771
772        :param threat_feed_key: The threat_feed_key of this WafLog.
773        :type: str
774        """
775        self._threat_feed_key = threat_feed_key
776
777    @property
778    def access_rule_key(self):
779        """
780        Gets the access_rule_key of this WafLog.
781        The `AccessRule` key that matched the request. For more information about
782        access rules, see `UpdateAccessRules`.
783
784
785        :return: The access_rule_key of this WafLog.
786        :rtype: str
787        """
788        return self._access_rule_key
789
790    @access_rule_key.setter
791    def access_rule_key(self, access_rule_key):
792        """
793        Sets the access_rule_key of this WafLog.
794        The `AccessRule` key that matched the request. For more information about
795        access rules, see `UpdateAccessRules`.
796
797
798        :param access_rule_key: The access_rule_key of this WafLog.
799        :type: str
800        """
801        self._access_rule_key = access_rule_key
802
803    @property
804    def address_rate_limiting_key(self):
805        """
806        Gets the address_rate_limiting_key of this WafLog.
807        The `AddressRateLimiting` key that matched the request. For more information
808        about address rate limiting, see `UpdateWafAddressRateLimiting`.
809
810
811        :return: The address_rate_limiting_key of this WafLog.
812        :rtype: str
813        """
814        return self._address_rate_limiting_key
815
816    @address_rate_limiting_key.setter
817    def address_rate_limiting_key(self, address_rate_limiting_key):
818        """
819        Sets the address_rate_limiting_key of this WafLog.
820        The `AddressRateLimiting` key that matched the request. For more information
821        about address rate limiting, see `UpdateWafAddressRateLimiting`.
822
823
824        :param address_rate_limiting_key: The address_rate_limiting_key of this WafLog.
825        :type: str
826        """
827        self._address_rate_limiting_key = address_rate_limiting_key
828
829    @property
830    def timestamp(self):
831        """
832        Gets the timestamp of this WafLog.
833        The date and time the Web Application Firewall processed the request and logged it.
834
835
836        :return: The timestamp of this WafLog.
837        :rtype: datetime
838        """
839        return self._timestamp
840
841    @timestamp.setter
842    def timestamp(self, timestamp):
843        """
844        Sets the timestamp of this WafLog.
845        The date and time the Web Application Firewall processed the request and logged it.
846
847
848        :param timestamp: The timestamp of this WafLog.
849        :type: datetime
850        """
851        self._timestamp = timestamp
852
853    @property
854    def log_type(self):
855        """
856        Gets the log_type of this WafLog.
857        The type of log of the request. For more about log types, see `Logs`__.
858
859        __ https://docs.cloud.oracle.com/iaas/Content/WAF/Tasks/logs.htm
860
861
862        :return: The log_type of this WafLog.
863        :rtype: str
864        """
865        return self._log_type
866
867    @log_type.setter
868    def log_type(self, log_type):
869        """
870        Sets the log_type of this WafLog.
871        The type of log of the request. For more about log types, see `Logs`__.
872
873        __ https://docs.cloud.oracle.com/iaas/Content/WAF/Tasks/logs.htm
874
875
876        :param log_type: The log_type of this WafLog.
877        :type: str
878        """
879        self._log_type = log_type
880
881    @property
882    def origin_address(self):
883        """
884        Gets the origin_address of this WafLog.
885        The address of the origin server where the request was sent.
886
887
888        :return: The origin_address of this WafLog.
889        :rtype: str
890        """
891        return self._origin_address
892
893    @origin_address.setter
894    def origin_address(self, origin_address):
895        """
896        Sets the origin_address of this WafLog.
897        The address of the origin server where the request was sent.
898
899
900        :param origin_address: The origin_address of this WafLog.
901        :type: str
902        """
903        self._origin_address = origin_address
904
905    @property
906    def origin_response_time(self):
907        """
908        Gets the origin_response_time of this WafLog.
909        The amount of time it took the origin server to respond to the request, in seconds.
910
911
912        :return: The origin_response_time of this WafLog.
913        :rtype: str
914        """
915        return self._origin_response_time
916
917    @origin_response_time.setter
918    def origin_response_time(self, origin_response_time):
919        """
920        Sets the origin_response_time of this WafLog.
921        The amount of time it took the origin server to respond to the request, in seconds.
922
923
924        :param origin_response_time: The origin_response_time of this WafLog.
925        :type: str
926        """
927        self._origin_response_time = origin_response_time
928
929    def __repr__(self):
930        return formatted_flat_dict(self)
931
932    def __eq__(self, other):
933        if other is None:
934            return False
935
936        return self.__dict__ == other.__dict__
937
938    def __ne__(self, other):
939        return not self == other
940