def save(self):
if self.object_id:<EOL><INDENT>if not self._track_changes:<EOL><INDENT>return True  <EOL><DEDENT>url = self.build_url(<EOL>self._endpoints.get('<STR_LIT>').format(id=self.object_id))<EOL>method = self.con.patch<EOL>data = self.to_api_data(restrict_keys=self._track_changes)<EOL><DEDENT>else:<EOL><INDENT>if self.__folder_id:<EOL><INDENT>url = self.build_url(<EOL>self._endpoints.get('<STR_LIT>').format(<EOL>folder_id=self.__folder_id))<EOL><DEDENT>else:<EOL><INDENT>url = self.build_url(self._endpoints.get('<STR_LIT>'))<EOL><DEDENT>method = self.con.post<EOL>data = self.to_api_data(restrict_keys=self._track_changes)<EOL><DEDENT>response = method(url, data=data)<EOL>if not response:<EOL><INDENT>return False<EOL><DEDENT>if not self.object_id:<EOL><INDENT>contact = response.json()<EOL>self.object_id = contact.get(self._cc('<STR_LIT:id>'), None)<EOL>self.__created = contact.get(self._cc('<STR_LIT>'), None)<EOL>self.__modified = contact.get(self._cc('<STR_LIT>'),<EOL>None)<EOL>local_tz = self.protocol.timezone<EOL>self.__created = parse(self.created).astimezone(<EOL>local_tz) if self.__created else None<EOL>self.__modified = parse(self.modified).astimezone(<EOL>local_tz) if self.__modified else None<EOL><DEDENT>else:<EOL><INDENT>self.__modified = self.protocol.timezone.localize(dt.datetime.now())<EOL><DEDENT>return True<EOL>
Saves this contact to the cloud (create or update existing one
        based on what values have changed)

        :return: Saved or Not
        :rtype: bool